Ciao, c'è qualcuno che sa come calcolare il valore CRC di una stringa in formato Modbus?
Per esempio, da questa stringa:
11 01 00 03 00 0C
Il CRC calcolato deve risultare
CE9F (CE High, 9F Low)
E per la stringa:
11 01 02 CD 0B
Il CRC calcolato deve essere
6D 68
Trovando una guida dice di eseguire i seguenti passaggi:
-------------------------------------------------------------------------------------------------------
Gli step necessari per il calcolo del CRC16 sono i seguenti:
Caricare un registro a 16bit con FFFh (tutti i bit a 1)
Fare l’OR esclusivo del primo carattere con il byte superiore del registro, porre il risultato nel registro.
Spostare il registro a destra di un bit.
Se il bit uscito a destra dal registro è un 1, fare l’OR esclusivo del polinomio generatore 1010000000000001 con il registro.
Ripetere per 8 volte i passi 3 e 4
Fare l’OR esclusivo del carattere successivo con il byte superiore del registro, porre il risultato nel registro.
Ripetere i passi 3 e 6 per tutti i caratteri del messaggio.
Il contenuto del registro a 16 bit è il codice di ridondanza CRC che deve essere aggiunto al messaggio.
-------------------------------------------------------------------------------------------------------
Questa è una tabella riassuntiva per i valori che si devono calcolare.
Ho provato a scrivere questo codice:
a non va per niente bene, in pratica mi calcola il crc che pare a lui.....
Qualcuno saprebbe aiutarmi per favore?
Per esempio, da questa stringa:
11 01 00 03 00 0C
Il CRC calcolato deve risultare
CE9F (CE High, 9F Low)
E per la stringa:
11 01 02 CD 0B
Il CRC calcolato deve essere
6D 68
Trovando una guida dice di eseguire i seguenti passaggi:
-------------------------------------------------------------------------------------------------------
Gli step necessari per il calcolo del CRC16 sono i seguenti:
Caricare un registro a 16bit con FFFh (tutti i bit a 1)
Fare l’OR esclusivo del primo carattere con il byte superiore del registro, porre il risultato nel registro.
Spostare il registro a destra di un bit.
Se il bit uscito a destra dal registro è un 1, fare l’OR esclusivo del polinomio generatore 1010000000000001 con il registro.
Ripetere per 8 volte i passi 3 e 4
Fare l’OR esclusivo del carattere successivo con il byte superiore del registro, porre il risultato nel registro.
Ripetere i passi 3 e 6 per tutti i caratteri del messaggio.
Il contenuto del registro a 16 bit è il codice di ridondanza CRC che deve essere aggiunto al messaggio.
-------------------------------------------------------------------------------------------------------
Questa è una tabella riassuntiva per i valori che si devono calcolare.
Ho provato a scrivere questo codice:
B4X:
Sub CRC(buf() As Byte, lbuf As Int) As Int
Dim CRC1 As Int
CRC1 = 0xffff
For i = 0 To lbuf - 1
CRC1 = Bit.Xor(CRC1, buf(i))
For j = 0 To 7
Dim k As Int = Bit.AND(crc1, 1)
CRC1 = Bit.AND(Bit.AND(CRC1, 0xfffe) / 2, 0xf777)
If k > 0 Then CRC1 = Bit.Xor(CRC1, 0xa001)
Next
Next
Return CRC1
End Sub
a non va per niente bene, in pratica mi calcola il crc che pare a lui.....
Qualcuno saprebbe aiutarmi per favore?