ako naprogramovat

Pavel Kořenský pavel.korensky na dator3.cz
Pátek Duben 12 18:36:41 CEST 2024


Ahoj,

no to by mělo být skoro podobné. Jen uděláš takový malý stavový automat.

Packet = 0
1 Je znak ?
2. Pokud ano, přečti ho
3. Je to B5 ?
4. Pokud ano, tak Packet = Packet + 1 jinak Packet = 0 a jdi zpět na 1.
5. Je znak ?
6. Pokud ano, přečti ho
7. Packet = 1 ?
8. Pokud ano, je poslední přečtený znak 62 ?
9. Pokud ano, tak Packet = 3 jinak Packet = 0

A tak dále.

Prostě čekáš na to, až se objeví sekvence tech dvou bytů značících 
začátek packetu. Pak načteš z dalších dvou packetů délku a buď si 
alokuješ tu délku jako nějaké pole nebo ve smyčce čteš znaky a dáváš je 
do řetězce. Já nevím, jestli Arduino umí dynamické alokace paměti. Pokud 
ano, je lepší to ukládat do pole bytů.
Až načteš znaky celé délky, tak načteš dva další (ten checksum), 
spočítáš si checksum uložených dat a pokud to souhlasí, máš celý packet 
správně. Pokud to nesouhlasí, tak to zahodíš a skok na začátek celého 
toho podprogramu.

Zdraví PavelK


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,
>
> b.
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240412/521cb5a6/attachment.htm>


Další informace o konferenci Hw-list