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
Problem mit CRC16 Berechnung
- __blackjack__
- User
- Beiträge: 13268
- 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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
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
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