Cheksum in....

Moderator: tilz0R

Cheksum in....

OdgovorNapisal/-a malci » 19 Nov 2021, 19:02

Pozdrav.

Slišal večkrat za ta izraz, a zastopim ga (še) ne, mislim pa da bi mi lahko pomagal pri moje problemu.
Če si prav predstavljam, je to nekaj zadnjih bytov v stringu ki ga dobimo po serijski komunikaciji? In le ti označujejo, da je cel string prejet in...?
Se ga predvideti, oz izračunati, če nimaš popolne dokumentacije o prejetih stringih?

Namreč, moj BMS mi pošilja 139 bytov v nizu in zadnja dva (138,139) sta cheksum. A vsak prejeti niz sta različna
Koda: Izberi vse
...192F
...170F
...1295
 itd


Kako naj jaz (oz moj arduino) ve, kdaj je prebral celoten string iz serijskega buffer-a in lahko pošlje ponovno zahtevo? Sedaj imam to rešeno časovno in zahtevo pošlje na 1s, a bi rad pohitril. Prejeti string se ne zaključuje niti z CR, niti z LF

lp
Uroš
Uporabniški avatar
malci
 
Prispevkov: 231
Pridružen: 18 Jan 2015, 09:44
Kraj: Polhov Gradec
Zahvalil se je: 80 krat
Prejel zahvalo: 93 krat
Uporabnika povabil: sundancer
Število neizkoriščenih povabil: 12

Re: Cheksum in....

OdgovorNapisal/-a zanka » 19 Nov 2021, 19:34

Če poznaš preostalih 137 zlogov, potem lahko greš po tabeli najbolj znanih formul za checksum in poiščeš kandidate: formule, ki ti za dane podatke vrnejo isti rezultat kot zadnja 2 zloga. Potem to isto formulo ponoviš na preostalih vrsticah in če se ujema na 100 vrsticah, lahko skleneš, da si našel pravo formulo.

Predlagam, če ni ravno skrivnost, da sem napišeš 5 izpisov in poiščem.
Zadnjič spremenil zanka, dne 19 Nov 2021, 19:45, skupaj popravljeno 1 krat.
Uporabniški avatar
zanka
 
Prispevkov: 3814
Pridružen: 17 Mar 2016, 01:16
Kraj: SI-8000
Zahvalil se je: 141 krat
Prejel zahvalo: 507 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 99

Re: Cheksum in....

OdgovorNapisal/-a blasny » 19 Nov 2021, 19:45

malci je napisal/-a:Če si prav predstavljam, je to nekaj zadnjih bytov v stringu ki ga dobimo po serijski komunikaciji

Da. V praksi je checksum vedno na koncu.
malci je napisal/-a:Se ga predvideti, oz izračunati, če nimaš popolne dokumentacije o prejetih stringih?

Da. Checksum se računa na zaporedju bytov. Algoritem ne zanima, kaj byte-i pomeijo. Rabiš samo nekaj primerov in lahko s poskušanjem na online calculatorjih ugotoviš, kateri algoritem je uporabljen.
Glej CRC algoritme. Pri serijski komunikaciji je praktično vedno uporabljena ena od CRC variant.
https://crccalc.com/
https://www.tahapaksu.com/crc/

malci je napisal/-a:Kako naj jaz (oz moj arduino) ve, kdaj je prebral celoten string iz serijskega buffer-a in lahko pošlje ponovno zahtevo?

Checksum ti pri tem ne bo pomagal. Dolžino sporočila moraš vedeti sam. Ampak saj že veš, da je sporočilo dolgo 139 znakov.
blasny
 
Prispevkov: 849
Pridružen: 18 Jan 2015, 16:48
Kraj: Tepanjce
Zahvalil se je: 545 krat
Prejel zahvalo: 333 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 36

Re: Cheksum in....

OdgovorNapisal/-a malci » 19 Nov 2021, 19:52

Aha, potem je cheksum ( oz CRC?) samo za preverjanje, če so bili vsi podatki sprejeti pravilno? Ok, to bom potem uporabil pri nadgradnji mojega projekta.
Bom pa sedaj samo malenkostno posodobil že napisano kodo. Že itak sem sedaj bral iz buffer-a, dokler je bilo kaj v njem. Sploh ne vem, zakaj sem potem čakal še 1s... :_banghead Bom kar takoj poslal novo zahtevo.

lp
Uporabniški avatar
malci
 
Prispevkov: 231
Pridružen: 18 Jan 2015, 09:44
Kraj: Polhov Gradec
Zahvalil se je: 80 krat
Prejel zahvalo: 93 krat
Uporabnika povabil: sundancer
Število neizkoriščenih povabil: 12

Re: Cheksum in....

OdgovorNapisal/-a blasny » 19 Nov 2021, 19:55

Še tole. Poenostavitev, kako preverjat, da je checksum pravi.

Recimo, da imaš sporočilo 1234 v hex. CRC-8 za to sporočilo je F1

Preverjaš tako, da celo sporočilo skupaj s CRC byti spustiš skozi isti algoritem. Če je sporočilo prejeto brez napak, potem je CRC takega zaporedja enaka 0. Če ni 0, potem je sporočilo "pokvarjeno"
CRC-8 od 1234F1 je enak 0
blasny
 
Prispevkov: 849
Pridružen: 18 Jan 2015, 16:48
Kraj: Tepanjce
Zahvalil se je: 545 krat
Prejel zahvalo: 333 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 36


Vrni se na C in sorodni jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost