Zaslal: út říjen 06 2009, 6:55 Předmět: Příjem řetězce atmelem
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;
Založen: Mar 02, 2005 Příspěvky: 1274 Bydliště: Bratislava, Petrzalka
Zaslal: út říjen 06 2009, 7:39 Předmět:
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
Mohlo by to vypadat třeba takto, v C neumím, tak mě nemlaťte za případné chyby.
kód:
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;
}
}
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: út říjen 06 2009, 8:49 Předmět:
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[?]
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í?
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: út říjen 06 2009, 9:16 Předmět:
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[?]
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.
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: út říjen 06 2009, 9:55 Předmět:
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[?]
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 napsal(a):
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 napsal(a):
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.
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;
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: út říjen 06 2009, 15:50 Předmět:
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[?]
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?
Moje řešení je sice nejlepší, ale i tak bys mohl místo planého teoretizování předvést něco praktického.
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: út říjen 06 2009, 20:43 Předmět:
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[?]
Založen: Jul 21, 2006 Příspěvky: 25741 Bydliště: skoro Brno
Zaslal: út říjen 06 2009, 21:05 Předmět:
Anonym napsal(a):
Moje řešení je sice nejlepší, ale i tak bys mohl místo planého teoretizování předvést něco praktického.
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 _________________ 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[?]
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2Další
Strana 1 z 2
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.