Kod pisu v C
data přijímam v tomto cyklu :
while (1==1){
while ((USR & (1 << RXC)) == 0) { };
znak = UDR;
... //zpracovani vysledneho retezce
}
Dekuji moc za každou radu
Moderátor: Moderátoři
Kód: Vybrat vše
int stav;
stav = 0;
while (1){
while ((USR & (1 << RXC)) == 0) { };
znak = UDR;
switch (stav) {
case 0 : if (znak == '#') stav = 1; // Přijat úvodní #, příště čeká :
break;
case 1 : if (znak == ':') stav = 2; // Přijata :, příště čeká řetězec
else stav = 0; // Přijat jiný znak než :, začne znovu
break;
case 2 : if (znak == '#') {
stav = 0; // Přijat ukončující #, příště čeká na úvodní #
zpracuj přijaté znaky;
}
else {
ulož někam znak; // Přijat znak řetězce
}
break;
}
}
ZdenekHQ píše:Používám to v přerušení na modbus atd. a nikdy jsem si nevšiml, že by to nějak zdržovalo. Naopak je to spolehlivý a ještě nikdo to nedokázal poplést či kousnout a spolkne to jakoukoliv sekvenci, klidně i dva různý protokoly najednou (samozřejmě poslaný postupně za sebou)...
ZdenekHQ píše:Tak 200 bytů je hezký teoretický příklad, ale v praxi i v zadání se jedná většinou o pár znaků a nikdo netvrdí, že je ten můj algoritmus pro větší možství dat použitelnej. Prostě příklad jako příklad.
ZdenekHQ píše:Tady u tohoto zadání máš definovaný koncový znaky a to tě svádí psát algoritmus tak, jak jsi to napsala - i když jako teoretický zjednodušený příklad je to v pořádku.
ZdenekHQ píše:Když zůstaneme u těch 200 znaků - schválně, co se stane s Tvým algoritmem, když master pošle za sebou třeba 20x #:0ABCDEF# a chybou přenosu ti vypadne jeden ukončovací křížek.
Kód: Vybrat vše
switch (stav) {
case 1 : if (znak == ':') { // Přijata :, příště čeká řetězec
stav = 2;
break;
}
else stav = 0; // Přijat jiný znak než :, začne znovu
case 0 : if (znak == '#') stav = 1; // Přijat úvodní #, příště čeká :
break;
case 2 : if (znak == '#') {
stav = 0; // Přijat ukončující #, příště čeká na úvodní #
zpracuj přijaté znaky;
}
else {
ulož někam znak; // Přijat znak řetězce
}
break;
ZdenekHQ píše:Já si tady nebudu hrát na ing. F, takže jsem o něco spokojenější. Pokud mému zařízení stačí 8B, může se na sběrnici honit třeba MB a já prostě tyto data budu ignorovat, aniž bych je přijmul.
Anonym píše:Moje řešení je sice nejlepší, ale i tak bys mohl místo planého teoretizování předvést něco praktického.