No jo - ale přijde první, ukončí se řetězec a nahodí se “prijato” (mimochodem - na 1 bit nemusíš používat 16-bitový int - v nejhorším případě stačí 8-bitový char) a index pro zápis se nastaví na 1. znak řetězce, zpracuješ řetězec (první znak je jaký potřebuješ - rozsvítíš LEDku), mezitím dorazí druhý z páru - zapíšeš 0 do indexu 0 (1. znak řetězce) - tedy smaže řetězec úplně - a nahodí se “prijato”, takže s tímto druhým znakem zpracováváš řetězec “”. Tedy zhasneš LEDku. LEDka tedy jenom krátce blikne. Při 9600bd je to bliknutí dlouhé cca 0,1ms.
Tak to jsi mě dostal já počítal ze přijde buď jeden a nebo druhý
Tak jsem si tam hodil kontrolu kolikrát se provede přijato po odeslání řetězce a je to cajk. Každopádně tam musím dát stejně volatile char zprava[16]; bez toho to prostě nefunguje.
Modifikátor volatile
Druhým z modifikátorů, které ovlivňují optimalizaci, je modifikátor volatile. Pokud tímto klíčovým slovem označíme nějakou proměnnou, kompilátor ji nebude optimalizovat. Modifikátor volatile se používá především v případech, kdy hodnota proměnné může být měněna nějakým asynchronním procesem z vnějšku programu, např. pomocí přerušení. V takovém případě by mohl kompilátor dospět k chybným závěrům o funkci některých programových konstrukcí a nesprávně program optimalizovat.
Ale jakto, že pokud použiji příkaz na porovnávání řetězců strcmp, tak když nechám volatile, překladač dá varování: passing argument 1 of ‘strncmp’ discards qualifiers from pointer target type.
Každopádně strcmp mi funguje v pohodě bez Volatile.
if(strcmp(zprava,"on")==0){PORTA |= (1<<PORTA0);}
Už jsem se do toho zamotal těmahle příkazama co jak vlastně funguje nebo nefunguje.A do toho ještě sychronizace hlavního programu a přerušení. Jinak to taky dělá neplechu. Asi programátor ze mě nebude,