Forum » Programiranje » NMEA checksum
NMEA checksum
boss-tech ::
Naredil sem metodov javi, ki vneseni string pregleda(XOR), in potem dobljeni rezultat spremenim v hex. Če primerjam z http://nmeachecksum.eqth.net/ dobim enak rezultat.
Če vnesem: GSC,011412000010789,M2(P3=500)
dobim:
checksum: 114
Integer.toHexString(checksum): 72
Sedaj pa je problem ker se rezultat ne ujema z rezultati v manualu. Dobil naj bi 35. Sem pa podrobno prebral navodila :
Mislim da je problem s temi 4 bolj in manj pomembnimi biti rezultata... kako naj jih dobim?
String c; int checksum=0; for (int i = 0; i < command.length(); i++) { // if it is first value for the checksum if (i == 0) { checksum = (byte)command.charAt(i); } else { checksum = checksum ^ (byte)command.charAt(i); } }
Če vnesem: GSC,011412000010789,M2(P3=500)
dobim:
checksum: 114
Integer.toHexString(checksum): 72
Sedaj pa je problem ker se rezultat ne ujema z rezultati v manualu. Dobil naj bi 35. Sem pa podrobno prebral navodila :
the checksum value is derived by the same method of NMEA standard. its calculated by XOR the 8 bits of each character before in the sentence excluding *.
The HEX value of the most significant and least significant 4 bits of the result are converted to 2 ASCII characters.
Mislim da je problem s temi 4 bolj in manj pomembnimi biti rezultata... kako naj jih dobim?
- spremenil: Primoz ()
fiction ::
Tale tvoj if (i == 0) je dokaj neoptimalen. Ponavadi noces, da se nekaj preverja vsak obhod zanke, ce
ves da to rabis samo prvic. Kot resitev bi lahko zanka tekla od 1 naprej tisto za 0 bi pa ze prej
naredil. Ampak tukaj se izkaze, da je se lazje. 0 XOR X je kar X. Torej checksum inicializiras na 0
(tako kot to ze imas), potem pa delas samo checksum ^= (byte)command.charAt(i) za vsak znak.
Kar hoce standard je da zdaj zapises znaka 'f' in 'e'. Vse skupaj je tako napisano samo zaradi jasnosti, da ne bi kdo za checksum dodajal kaksnih cudnih znakov ali kaj podobnega.
ves da to rabis samo prvic. Kot resitev bi lahko zanka tekla od 1 naprej tisto za 0 bi pa ze prej
naredil. Ampak tukaj se izkaze, da je se lazje. 0 XOR X je kar X. Torej checksum inicializiras na 0
(tako kot to ze imas), potem pa delas samo checksum ^= (byte)command.charAt(i) za vsak znak.
The HEX value of the most significant and least significant 4 bits of the result are converted to 2 ASCII characters.To je tocno opis toHexString na enem bajtu (vecje vrednosti od 255 pa glede na xor bajtov itak ne mores dobiti). Ce gledas hexadecimalno recimo 0xfe so zgornji 4 biti 0xf, spodnji 4 biti pa 0xe. (0xfe = 254 = 11111110)
Kar hoce standard je da zdaj zapises znaka 'f' in 'e'. Vse skupaj je tako napisano samo zaradi jasnosti, da ne bi kdo za checksum dodajal kaksnih cudnih znakov ali kaj podobnega.
Mislim da je problem s temi 4 bolj in manj pomembnimi biti rezultata... kako naj jih dobim?Z uporabo logicnega IN nad biti in malo shiftanja. Ce hoces zgornje 4 bite je nekaj ala (x & 0xf0) >> 4, za spodnje pa (x & 0x0f), ampak tega po vsej verjetnosti ne rabis.
Sedaj pa je problem ker se rezultat ne ujema z rezultati v manualu. Dobil naj bi 35.Ce je tisti prvi G od GSC prevec (in ga v manualu niso racunali) ali pa ce je na koncu se en G pa si ga ti spustil bi dobil 35. Sicer pa ni nujno, da je tisto prav. Ce z locenim kalkulatorjem dobis isto vrednost, potem je tisto kar izracunas najbrz prav.
Zgodovina sprememb…
- spremenil: fiction ()
boss-tech ::
Hvala ti za izčrpno analizo. Moja metoda je bila vredu napisana, prav tako ok dela kalkulator. V priročniku so naredili napako in pri vnosu niso dali zraven G pre GSS in tako sem poskusil vse primere in je potem delalo ok. Hvala
Zgodovina sprememb…
- spremenil: boss-tech ()
boss-tech ::
Zanima me če se je kdo ubadal s pošiljanjem podatkov na neko napravo preko serijskega oz USB porta... imam metodo:
Zdaj pa ne vem zakaj ne dobim nič nazaj? A mi še kaj manjka? Pošiljam pa komande, ki jih naprava dobi in vrne nek rezultat...
public void run () { System.out.println("vnesi: "); try { serialPort.notifyOnOutputEmpty(true); } catch (Exception e) { System.out.println("Error setting event notification"); System.out.println(e.toString()); } System.out.println("pisem \""+messageString+"\" na "+serialPort.getName()); try { out.write(messageString.getBytes()); out.close(); } catch (IOException e) {} }
Zdaj pa ne vem zakaj ne dobim nič nazaj? A mi še kaj manjka? Pošiljam pa komande, ki jih naprava dobi in vrne nek rezultat...
Zgodovina sprememb…
- spremenil: Senitel ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Java] Prevajanje in šumniki v ubuntuOddelek: Programiranje | 2483 (2100) | mmaestro |
» | [JAVA] String problem!Oddelek: Programiranje | 1663 (1360) | Sergio |
» | Java-Izdelek-NujnoOddelek: Programiranje | 1504 (1276) | iggy |
» | osnove v Javi - zvezdiceOddelek: Programiranje | 3530 (2752) | Tutankhamun |
» | [NALOGA][Java] Branje vsebine datoteke vzvratnoOddelek: Programiranje | 1602 (1544) | SkIDiver |