Problem mit CRC16 Berechnung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Mamute
User
Beiträge: 2
Registriert: Mittwoch 20. Juli 2022, 19:33

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
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aus der Beschreibung wird nicht klar, was da passieren muss. Das “in der CRC gezählt werden muss” klingt komisch. Hast du einen Link auf die Spezifikation?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mamute: Auf jeden Fall ist die 12 nicht das Argument für `range()`. Ein `octet` hat wie der Name schon sagt 8 Bits und keine 12. Vielleicht bedeutet die CRC Länge von 12 ja, dass die Prüfsumme 12 Bits statt 16 Bits lang ist, aber sicher wäre ich mir da auch nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Mamute
User
Beiträge: 2
Registriert: Mittwoch 20. Juli 2022, 19:33

Hallo zusammen,

Am Anfang ich will euch Bedanken für die Antworten 😊
Also in NachrichtKatalog von Botschaften habe ich kommende Daten:

CRC ID = 118 (76h) / CRC_Beispill_Name
CRC_Beispiel_Name / Frame = Byte 0 / Offset= Bit 0 / Lenght = 12 Byte

Bit 7 / Bit 6 / Bit5 / Bit 4 /Bit 3 / Bit2 / Bit1 / Bit 0
Byte11 XXXXXXXXXXXXXXXXXXXXX/ Beispiel Name (Bit 0-3)
Byte10 Beispiel Name 1 (Bit 0-7)
Byte9 Beispiel Name 2 (Bit 0-7)
Byte8 Beispiel Name 3 (Bit 4-7) / Beispiel Name 4 (Bit 0-3)
Byte7 Beispiel Name 5 (Bit 2-7) / Beispiel Name 6( Bit 0-1)
Byte6 Beispiel Name 7 (Bit 0-7)
Byte5 Beispiel Name 8 (Bit 0-7)
Byte4 Beispiel Name 9 (Bit 2-7) / Beispiel Name 10( Bit 0-1)
Byte3 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Byte2 ALIV_ Bispiel_Name (Bit 0-7)
Byte1 CRC_Beispiel_Name (Bit 0-7)
Byte0 CRC_Beispiel_Name (Bit 0-7)

Signal type: CHECKSUM, CRC16
Dieses Signal beinhaltet die CRC-Checksumme für die Standardabsicherung mit Applikations-CRC-16 (AUTOSAR
E2E Profil 5) laut Definition per Lastenheft Bordnetzkommunikation.
Das Signal verwendet die Applikations-Data-ID (16 Bit) 118 (dez) = 0076 (hex).

Data type: 16 Bit, Unsigned Integer (Byte 0, Bit 0...Byte 1, Bit 7)
Range: 0 ... 65535
Computation: (PH) = (DEC)
Also ich denke das sollte so funktionieren das der gerät sendet cyklisch daten (zB. Jeder 20ms)auf Prüfling:

Data=[0x0, 0x0, 0x0, 0x02, 0x3D, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0]
Und CRC in loop checkt die Daten ob dort Fehler ist.

Also das sind Alle Daten aus Botschaft Nachricht Katalog.
Die Botschaft Namen habe ich mit „Beispiel Name „ ersetzt.

Hier ist ein Link zum Autosar Specifikation :
Für genannte CRC Daten sind auf Seite 49 und 112.
https://www.autosar.org/fileadmin/user_ ... otocol.pdf

@_blackjack_ Dann vielleicht ich habe doch falsches Berechnung gefunden weil ich habe ein funktionierte Berechnung für dieses Botschaft ( von anderen Gerät und in andere Programmiersprache geschrieben) Ich weis nicht ob wenn ich das hier Teile ob das wird nicht dagegen Forum Rechten weil das ist nicht in Python aber ich weiß nicht in welche Sprache das geschrieben ist)

Aber der Loop schaut so aus:
for (i_CRC_Beispiel_name=2; i_CRC_Beispiel_Name<12; i_CRC_Beispiel_Name++)

Vielen Dank für Hilfe
Antworten