najděte mi někdo chybu v následujícím programu.
Očekávaná funkce:
V sériovém terminálu zadám "n98765" (bez uvozovek) a zobrazí se odpověď :
Kód: Vybrat vše
*** CISLO ***
98765
Kód: Vybrat vše
*** LED ***
4
0
Až sem to funguje.
Ale teď to přichází:
V sériovém terminálu zadám "b54" a měla by se zobrazit odpověď :
Kód: Vybrat vše
*** BARGRAF ***
54
Ve skutečnosti se nezobrazí nic.
A přitom je to v podstatě úplně stejná část kódu, jako při zadávání čísla ("n98765"), která funguje bez problému.
A dále:
V sériovém terminálu zadám "xxx" a měla by se zobrazit odpověď :
Kód: Vybrat vše
*** NEZNAMA FUNKCE ***
Já už tam žádnou chybu nevidím.
Paměti RAM i ProgMEM jsou v pořádku (využitých asi 10%).
Závorky ani středníky v kódu nechybí - kompilace proběhne bez problémů.
Všechny case jsou správně ukončeny breakama (kromě posledního defaultu).
Vypadá to, jakoby nějak nefungovala ta konstrukce SWITCH - CASE.
Nebo má nějaké omezení, o kterém nevím.
NEFUNKČNÍ KÓD je tady:
Kód: Vybrat vše
long vstup; // cislo zadavane pres seriovou linku
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available())
{
delay(50);
char funkce = Serial.read(); // prvni zadany znak udava funkci ('n', 'l', 'b')
switch (funkce)
{
case 'n': // podprogram pro zobrazeni cisla
vstup = Serial.parseInt(); // (volba cisla -9999 az 99999)
zobraz_cislo(vstup);
break;
case 'l': // podprogram pro rozsveceni a zhasinani LED
vstup = Serial.parseInt(); // (volba LED 0 az 7)
boolean sviti = Serial.parseInt(); // (volba stavu prislusne LED: 0 nebo 1)
zobraz_LED(vstup,sviti);
break;
case 'b': // podprogram pro nastaveni bargrafu
vstup = Serial.parseInt(); // (volba hodnoty bargrafu 0 az 100)
zobraz_bargraf(vstup);
break;
default: // jakykoliv jiny uvodni znak by se mel zahlasit jako neznama funkce
Serial.println("*** NEZNAMA FUNKCE ***");
}
while (Serial.available()) // zbytek znaku se z prijimaciho serioveho bufferu vymaze
{
Serial.read();
}
}
}
void zobraz_LED(long cislo_LED, boolean stav)
{
Serial.println("*** LED ***");
Serial.println(cislo_LED);
Serial.println(stav);
}
void zobraz_bargraf(long cislo)
{
Serial.println("*** BARGRAF ***");
Serial.println(cislo);
}
void zobraz_cislo(long cislo)
{
Serial.println("*** CISLO ***");
Serial.println(cislo);
}
-----------------------
Když tu konstrukci switch - case přepíšu pomocí jednoduchých podmínek IF ... , tak to funguje.
Funkční hlavní smyčka:
Kód: Vybrat vše
void loop()
{
if (Serial.available())
{
delay(50);
char funkce = Serial.read(); // prvni zadany znak udava funkci ('n', 'l', 'b')
if (funkce == 'n')
{
vstup = Serial.parseInt(); // (volba cisla -9999 az 99999)
zobraz_cislo(vstup);
}
if (funkce == 'l')
{
vstup = Serial.parseInt(); // (volba LED 0 az 7)
boolean sviti = Serial.parseInt(); // (volba stavu prislusne LED: 0 nebo 1)
zobraz_LED(vstup,sviti);
}
if (funkce == 'b')
{
vstup = Serial.parseInt(); // (volba hodnoty bargrafu 0 az 100)
zobraz_bargraf(vstup);
}
if (funkce != 'n' and funkce != 'l' and funkce != 'b')
{
Serial.println("*** NEZNAMA FUNKCE ***");
}
while (Serial.available()) // zbytek znaku se z prijimaciho serioveho bufferu vymaze
{
Serial.read();
}
}
}