ako naprogramovat
Pavel Hudeček
edizon na seznam.cz
Pátek Duben 12 18:47:03 CEST 2024
Záleží na okolnostech, např. jestli je k dispozici víc nebo míň paměti.
"málopaměťový" začátek je zahazovat všechno, dokud nepřijde B5 a pak
začít ukládat do bufferu a pokračovat do doby, než je buď regulérní
konec, nebo chyba, včetně podezřelé časové mezery. Pak buď zpracovat,
nebo ne a znovu na čekání na začátek.
Nebo se to dá prostě bufferovat do dostatečně velkého bufferu a až v něm
hledat. To má výhodu, že se dají třeba i opravovat chyby.
Další pokračování je to nějak dekódovat. Nejlepší je když má paket
pevnou strukturu, pak stačí ji mít nadefinovanou přes struct, takže se k
ní dá rovnou přistoupit tak jak je. Pokud to není na 8b jednočipu, tak
jsou možné nějaké boje s optimalizací, třeba použití #pragma pack.
Respektování ovšem není pro kompilátor povinné, případně to ani nejde,
třeba kvůli HW nutnosti zarovnání dat v paměti. Alternativou je si to do
tý struktury, nebo jednotlivých proměnných vytahat jednotlivě.
PH
Dne 12.04.2024 v 18:19 Daniel Valuch napsal(a):
>
> zdravim osadenstvo,
>
> programovat viem len velmi zakladne, preto by som mal na piatok
> algoritmicku... Dokoncujem ziskavanie presneho casu z GNSS modulu o
> ktorych sme tu uz nejaky cas rozpravali.
>
> Ten generuje dva typy vystupu po seriovej linke. Klasicky ascii, ktory
> je ukonceny \n znakom a parsovanie tohoto stringu je trivialne (robim
> v arduino ide). Prijimaju sa data, tie sa pridavaju do stringu a ked
> pride \n tak sa to rozobere a urobi co treba
>
> void serialEvent() {
> while (Serial.available()) {
> // get the new byte:
> char inChar = (char)Serial.read();
> if (inChar == '\n') {
> // sprava/retazec je hotovy, rozparsuj a urob co treba
> tempString = "";
> }
> // keep receiving until \n arrives
> else {
> // add it to the inputString and keep receiving:
> tempString += inChar;
> }
>
> Druhy vystup je ale binarny, prichadzaju pakety, ktore maju strukturu
> definovanu, ale paket zacina opacne.
>
> 0000 B5 62 06 8A 18 00 00 05 00 00 01 00 76 10 01 05
> 0010 00 53 10 01 7E 01 91 20 00 7F 01 91 20 01 00 B6
>
> Prve dva bajty na zaciatku B5 62 vzdy oznacuju zaciatok paketu
>
> dalsie dva 06 8A oznacuju o aky paket ide
>
> nasledujuce dva 18 00 dlzku kolko byteov spravy nasleduje (v tomto
> pripade 24)
>
> potom je samotna sprava
>
> a na konci 00 B6 su dva bajty checksum
>
> a s tymto si neviem poradit, ako to zapisat aby to pocuvalo kedy pride
> B5 62, pockalo ako dlha bude sprava a potom zapisalo do nejakeho
> stringu data.
>
> Ako na to?
>
> dakujem,
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240412/4449310e/attachment.htm>
Další informace o konferenci Hw-list