Problem mit CRC16 Berechnung
Verfasst: Mittwoch 20. Juli 2022, 20:05
Hallo zusammen,
Ich heiße Marek und ich bin Anfänger in Python 3 Programmiersprache.
Ich brauche Hilfe mit Implementierung CRC16 Berechnung in einem Mobiles Gerät welche basiert auf Raspberry pi 4 and Pi CANFD Board.
Also es geht über Crc16 Berechnung für CAN Botschaft.
In Dokumentation Stehen solche Daten :
Standard CRC16 Berechnung welche Basiert auf AUTOSAR E2E Profile 5 .
Nach der Suche habe ich gefunden dass das ist ein CRC16 CCITT mit Poly = 0x1021
In der Datei wurden auch Test Werten und Ergebnissen zum verfugung gestellt so habe ich das getestet und im ende bin ich ein Berechnung welche korrekte Summe gibt gefunden :
def crc16(data: bytes):
xor_in = 0xFFFF # initial value
xor_out = 0x0 # final XOR value
poly = 0x1021 # generator polinom (normal form)
reg = xor_in
for octet in data:
# reflect in
for i in range(8):
topbit = reg & 0x8000
if octet & (0x80 >> i):
topbit ^= 0x8000
reg <<= 1
if topbit:
reg ^= poly
reg &= 0xFFFF
# reflect out
return reg ^ xor_out
In der Datei von CAN Botschaften für genannte Botschaft sind solche Daten gegeben :
Checksum = 118 dez/0x76 hex
CRC lenght = 12
zusammen muss noch ein Alive Counter gebastelt werden also in crc16 muss er bis 256 zählen (0-255) also 0xFF
iMSG[j] += 0x01
if iMSG[j] >= 0xFF:
iMSG[j] = 0
leider ich verstehe nicht die ganzer CRC Thema und ich weiß nicht wie sollte ich das zusammen Packen
Natürlich ich verstehe das CRC Lenght wird die range entsprechen aber ich Weiß nicht wo sollte ich die checksum stellen.
def crc16(data: bytes):
xor_in = 0xFFFF # initial value
xor_out = 0x0 # final XOR value
poly = 0x1021 # generator polinom (normal form)
reg = xor_in
for octet in data:
# reflect in
for i in range(12):
topbit = reg & 0x8000
if octet & (0x80 >> i):
topbit ^= 0x8000
reg <<= 1
if topbit:
reg ^= poly
reg &= 0xFFFF
iMSG[j] += 0x01
if iMSG[j] >= 0xFF:
iMSG[j] = 0
# reflect out
return reg ^ xor_out
Entschuldigung für alle grammatische Fehlern und
Vielen Dank für Hilfe
Ich heiße Marek und ich bin Anfänger in Python 3 Programmiersprache.
Ich brauche Hilfe mit Implementierung CRC16 Berechnung in einem Mobiles Gerät welche basiert auf Raspberry pi 4 and Pi CANFD Board.
Also es geht über Crc16 Berechnung für CAN Botschaft.
In Dokumentation Stehen solche Daten :
Standard CRC16 Berechnung welche Basiert auf AUTOSAR E2E Profile 5 .
Nach der Suche habe ich gefunden dass das ist ein CRC16 CCITT mit Poly = 0x1021
In der Datei wurden auch Test Werten und Ergebnissen zum verfugung gestellt so habe ich das getestet und im ende bin ich ein Berechnung welche korrekte Summe gibt gefunden :
def crc16(data: bytes):
xor_in = 0xFFFF # initial value
xor_out = 0x0 # final XOR value
poly = 0x1021 # generator polinom (normal form)
reg = xor_in
for octet in data:
# reflect in
for i in range(8):
topbit = reg & 0x8000
if octet & (0x80 >> i):
topbit ^= 0x8000
reg <<= 1
if topbit:
reg ^= poly
reg &= 0xFFFF
# reflect out
return reg ^ xor_out
In der Datei von CAN Botschaften für genannte Botschaft sind solche Daten gegeben :
Checksum = 118 dez/0x76 hex
CRC lenght = 12
zusammen muss noch ein Alive Counter gebastelt werden also in crc16 muss er bis 256 zählen (0-255) also 0xFF
iMSG[j] += 0x01
if iMSG[j] >= 0xFF:
iMSG[j] = 0
leider ich verstehe nicht die ganzer CRC Thema und ich weiß nicht wie sollte ich das zusammen Packen
Natürlich ich verstehe das CRC Lenght wird die range entsprechen aber ich Weiß nicht wo sollte ich die checksum stellen.
def crc16(data: bytes):
xor_in = 0xFFFF # initial value
xor_out = 0x0 # final XOR value
poly = 0x1021 # generator polinom (normal form)
reg = xor_in
for octet in data:
# reflect in
for i in range(12):
topbit = reg & 0x8000
if octet & (0x80 >> i):
topbit ^= 0x8000
reg <<= 1
if topbit:
reg ^= poly
reg &= 0xFFFF
iMSG[j] += 0x01
if iMSG[j] >= 0xFF:
iMSG[j] = 0
# reflect out
return reg ^ xor_out
Entschuldigung für alle grammatische Fehlern und
Vielen Dank für Hilfe