Příjem řetězce atmelem

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
hajs
Příspěvky: 31
Registrován: 28 kvě 2007, 00:00

Příjem řetězce atmelem

#1 Příspěvek od hajs »

Ahoj. mužete mi někdo poradit jak vyhodnotit přijmutí řetězce který je vždy uzavřen do #: a # např (#:FF# , #:FT#) z koušel jsem počítat přijaté znaky a po dosažení počtu 5 vyhodnotit řetězec to funguje , ale problém je pokud mi přijde např sekvence 3 znaků a pak moje 5znaková tak mám v poli 3+2 a tím se mi posune celé vyhodnocování.. A už to nelze srovnat. Potřeboval bych neco ve stylu , ted dorazil '#' po nem ':' tak následující 2 znaky ulož do pole.

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 :)
Uživatelský avatar
Ivan_Ryger
Příspěvky: 1366
Registrován: 02 bře 2005, 00:00
Bydliště: Jára Cimrman- "Uppsala, Uppsala,... tam jsem taky nebyl"

#2 Příspěvek od Ivan_Ryger »

ja by som tam doplnil jednu docasnu premennu navyse, cosi ako register char cTmp1, cTmp2, a do nej by som paskoval prijate znaky.
Ked by prisla ta sekvencia, potom by bola podmienka, ktora zabezpeci ulozenie retazca.
Vlastne by to ani nemuselo byt cTmp1, cTmp2, ale jedna by mohla byt typu "Boolean" ktora by definovala stav automatu.
Ivan
Návštěvník

#3 Příspěvek od Návštěvník »

Mohlo by to vypadat třeba takto, v C neumím, tak mě nemlaťte za případné chyby.

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;
  }
}
Uživatelský avatar
hajs
Příspěvky: 31
Registrován: 28 kvě 2007, 00:00

#4 Příspěvek od hajs »

díky za nápad, vypadá to dobře v podvečer to zkusim a informuji zdali to zafungovalo ..
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#5 Příspěvek od ZdenekHQ »

Jde to i dělat zpětně. Vyrobit si posuvný registr třeba 8 znaků a křížek brát jako koncový znak. Po jeho příjmu mrknout zpětně znak po znaku, zda se nachází i dvojtečka s křížkem a to vyhodnotit a zpracovat, v případě úspěchu registr následně smazat. Registr se má mazat automaticky i v případě, že po určitou dobu nepřišel žádný znak (řádově jednotky až desítky ms u běžné komunikace).

Pokud bys chtěl jednoduchý zabezpečení, může být za dvojtečkou jedno číslo jako počet znaků. Chodí to spolehlivě na všemožný druhy komunikace, jen se nevyhodnocuje křížek, ale třeba CRC + minimální délka registru.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návštěvník

#6 Příspěvek od Návštěvník »

ZdenekHQ píše:Jde to i dělat zpětně. Vyrobit si posuvný registr třeba 8 znaků a křížek brát jako koncový znak. Po jeho příjmu mrknout zpětně znak po znaku, zda se nachází i dvojtečka s křížkem a to vyhodnotit a zpracovat,...

A zmýšlel ses nad časovou náročností takového řešení?
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#7 Příspěvek od ZdenekHQ »

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)...
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návštěvník

#8 Příspěvek od Návštěvník »

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)...

Kontrola struktury 200 bytového paketu určitě nezabere 50 taktů procesoru, takže jestli tu kontrolu děláš naráz v jednom přerušení, tak si na dost dlouho zabereš procesor. Ale asi souběžně neděláš nic jiného citlivého na latenci přerušení. A pokud si pamatuju, tak aspoň u modbusu RTU se začátek a konec paketu nedetekuje podle speciální sekvence znaků, ale podle mezery.
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#9 Příspěvek od ZdenekHQ »

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.

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.

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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návštěvník

#10 Příspěvek od Návštěvník »

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.

To neni teoretický příklad, musíš zvládnou všechny stavy, které protokol umožňuje, pokud protokol dovoluje poslat 1KB paket, musíš zvládnout stav kdy na sběrnici běhá 1KB paket i když tvoje zařízení komunikuje třeba jen s 8B paketama.

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.

Na tom taky není nic teoretického, v zadání je uvedeno přijmout řetězec mezi #: a # a to ten popsaný algoritmus zvládne v pohodě. Ukaž lepší algoritmus založený pouze na zadaných podmínkách.

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.

Vynechá se následující paket a další už se zase přijmou v pořádku.
Návštěvník

#11 Příspěvek od Návštěvník »

Takhle už jsi spokojenější? :wink:

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;
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#12 Příspěvek od ZdenekHQ »

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. Takto jsme i testovali - cpali jsme do procesoru metráky náhodně generovaných čísel a pak správnou sekvenci a testovalo se, jestli se nekousne.

Jinak lepší algo nemůžu představit, neboť z Tvého vyjadřování plyne, že Tvůj je ten nejlepší a všechno ostatní by způsobilo pouze nekonečnou dialogovou smyčku. Já se spokojím s druhým, čili posledním místem.

Doufám, že v obecném řetězci jsou křížek a dvojtečka odfiltrovány jako zakázané znaky.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Návštěvník

#13 Příspěvek od Návštěvník »

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.

Psal jsi, že je analyzuješ až zpětně po přijetí, tak jak je můžeš ignorovat, když nevíš, že nejsou pro tebe? 8O
Moje řešení je sice nejlepší, ale i tak bys mohl místo planého teoretizování předvést něco praktického. :twisted:
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#14 Příspěvek od ZdenekHQ »

Máš v té úvaze typicky ženskou chybu v logice - když vím, že pro mě přijde max. 8 či 16 znaků, analyzuji průběžně buffer délky 8 či 16 znaků a nesyslím všechno, co se po sběrnici honí. A mezi námi děvčaty - opět typická aplikace je chrápající slave, co po přijetí instrukce vyplivne data, jinak se většinou fláká. A moje chlebodárce netrápí, kolik vyplácám strojovýho času na spolehlivou komunikaci, ale spolehlivá komunikace sama o sobě.

A zdroják nedám, je to stejně jen hromada kódu v asm. Teoretické nakopnutí správným směrem většinou stačí.

EDIT - Napsal jsem původně ignoruji - ano, je to jedna možnost, že zpráva delší než 8 či 16 znaků není pro mě pak skutečně ignoruji, pouze čekám na mezeru. Nebo můžu průběžně analyzovat, záleží na aplikaci.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#15 Příspěvek od ZdenekHQ »

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. :twisted:


No, a tady mě tpřipomínáš chování Mrkvosoftu. Pustíš do světa "geniální" algoritmus, pak Tě někdo upozorní na to, že kvůli neplatným datům klidně zahodíš i následující platná data, ty to opravíš a opět - i když velmi opatrně - hlásáš, že je nejlepší. Ale bez nadřazeného timeoutu, hlídajícího dlouhé prodlevy mezi znaky to nikdy spolehlivý a tudíž nejlepší nebude. I kdyby ses stokrát na blond obarvila :twisted:
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“