Arduino Serial.read egymás után

Arduino Serial.read egymás után
2016-10-25T09:50:17+02:00
2016-10-27T11:28:21+02:00
2022-12-04T03:20:35+01:00
L@cus
Sziasztok!

Soros monitoron szeretnék egy Menü, Almenü rendszert kialakítani.

2 külön Switch..Case-el próbálkozom, de nem akar menni. Itt a kódrészletem.
Tud valaki segíteni?

void loop() { if (Serial.available()){ val = Serial.read(); } switch (val) { case 'A':{ Serial.print(val); almenu(); } break; case 'B':{ Serial.print(val); almenu(); } break; } } void almenu() { if (Serial.available()){ val1 = Serial.read(); } switch (val1) { case '1':{ Serial.println(val1); digitalWrite(10, HIGH); } break; case '2':{ Serial.println(val1); digitalWrite(10, HIGH); } break; } }
Vagy esetleg jobb ötlet?
Mutasd a teljes hozzászólást!
Az alábbi módon lett a kód átalakítva:

void loop() { if (Serial.available()){ val = Serial.read(); switch (val) { case 'A':{ val1 = val; Serial.print(val); almenu(); } break; case 'B':{ val1 = val; Serial.print(val); almenu(); } break; } } } void almenu() { while (val1 == val) { if (Serial.available()){ val1 = Serial.read(); switch (val1) { case '1':{ Serial.println(val1); digitalWrite(10, HIGH); } break; case '2':{ Serial.println(val1); digitalWrite(10, HIGH); } break; } } } }
Na így működik! Mindenkinek köszönöm a hozzászólás!
Mutasd a teljes hozzászólást!

  • Ha kiolvasod a serialt read el, utana mar nem tudod az erteket kiolvasni.
    ergo az almenunek passold at a val t.

    Azaz a read utan nem
    lesz available
    Mutasd a teljes hozzászólást!
  • ergo az almenunek passold at a val t.

    Ez szerintem rossz válasz, az almenüben egy új karaktert akar beolvasni.

    Ott viszont az a hiba, hogy az if-es rész azonnal lefut, és addigra jó eséllyel valóban nem lesz még új karakter, így a val1 értéke valami szemét (előző érték? Nincs teljes kód, nem lehet eldönteni) lesz, és a case szerkezet, ami viszont az  if-en kívül van, erre a memóriaszemétre fut le.

    A megoldás pedig az (is) lehet, hogy if helyett while-lal addig vársz az almenüben, míg végre van beolvasnivaló a soros porton:

    while (!Serial.available()); // megvárjuk a következő karaktert
    val1 = Serial.read();
    switch (val1)...

    Ha nem blokkolhatsz ilyen módon, akkor a loop-ban nyilván kell tartani, hogy a menübe, vagy az almenübe kell lépni a következő val hatására, és akkor tényleg át kell adni a val értékét az almenünek.
    Mutasd a teljes hozzászólást!
  • Valóban figyelmen kívül hagytam olyat egy másik ért véget akkor beolvasni

    Edit
    A másik tippem hogy használj OSC t
    CNMAT/OSC
    Mutasd a teljes hozzászólást!
  • Ahh... zenészek által összetákolt borzalom OSC
    Olyan a protokoll mint két pletyis néni a ház előtti kispadon

    Oké hogy Berkley, de legalább vitték volna át az infósokhoz revízióra
    Mutasd a teljes hozzászólást!
  • Az alábbi módon lett a kód átalakítva:

    void loop() { if (Serial.available()){ val = Serial.read(); switch (val) { case 'A':{ val1 = val; Serial.print(val); almenu(); } break; case 'B':{ val1 = val; Serial.print(val); almenu(); } break; } } } void almenu() { while (val1 == val) { if (Serial.available()){ val1 = Serial.read(); switch (val1) { case '1':{ Serial.println(val1); digitalWrite(10, HIGH); } break; case '2':{ Serial.println(val1); digitalWrite(10, HIGH); } break; } } } }
    Na így működik! Mindenkinek köszönöm a hozzászólás!
    Mutasd a teljes hozzászólást!
  • Szia!

    Örülök hogy sikerült! :) Pusztán kíváncsiságból: a

    void almenu() { while (!Serial.available()); val1 = Serial.read(); switch (val1) { case '1': Serial.println(val1); digitalWrite(10, HIGH); break; case '2': Serial.println(val1); digitalWrite(10, HIGH); break; } }
    azért nem működik, mert a soros porton ismétlődhet a főmenü val-ba olvasott értéke (pl. többször küldődik az 'A'), vagy mi a gond vele?
    Mutasd a teljes hozzászólást!
  • Ahogy mondod.
    Nagyon gyors az adatfeldolgozás.
    Volt olyan, "A"-t nyomtam és 3szor írta ki a képernyőre.
    Mutasd a teljes hozzászólást!
  • Ok. Mondjuk elég furán hangzik. :) Az átalakított loop() az if-en belüli switch révén biztosítja, hogy új karaktert olvass feldolgozás előtt, és a soros port nem szokott "ismételni", csak ha többször nyomod le a karaktert, szóval az utóbbi kódba helyettesítve az enyémet azt vártam volna, hogy működik. (Ha PC küldi a soros karaktereket.)

    No nem okoskodok, további jó munkát! :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd