CarHifiStore
08.03.2009, 18:40
Hallo,
auf Empfehlung bin ich nun hier im Robonetz gelandet - wenn es hier keine Lösung gibt geht es nicht, hieß es ;-)
Mein Problem: Ich muss eine CRC-Checksumme nach SAE J1850-Standart über 10 Datenbytes erstellen. Die Bascom-CRC-Routine kann ich nicht nehmen weil sie 8C (Dallas) als Generatorpolynom nimmt. Nach Wiki muss ich 1D als Polynom nehmen. Also hab ich mir eine Routine geschrieben bei der ich das Polynom frei einsetzen kann:
Dim Ar(10) As Byte
Dim Temp1 As Byte ' Temporäre Variable
Dim Temp2 As Byte ' Temporäre Variable
Dim X As Byte
Dim Crc As Byte
Dim Crcpoly As Byte
Dim Bytecounter As Byte
Dim Bitcounter As Byte
Ar(1) = &HB2
Ar(2) = &HD0
Ar(3) = &HE0
Ar(4) = &H70
Ar(5) = &H00
Ar(6) = &H00
Ar(7) = &H00
Ar(8) = &H00
Ar(9) = &H00
Ar(10) = &H00
Crcpoly = &H1D
Gosub Calc_crc
Print Hex(crc)
Crc = Crc8(ar(1) , 10)
Print Hex(crc)
End
Calc_crc:
Crc = 0
For Bytecounter = 1 To 10
Temp2 = Ar(bytecounter)
For Bitcounter = 0 To 7
Temp1 = Temp2 Xor Crc
Temp1 = 1 And Temp1
Shift Crc , Right
Crc = Crc And &HFF
Shift Temp2 , Right
Temp2 = Temp2 And &HFF
If Temp1 <> 0 Then
Crc = Crc Xor Crcpoly
End If
Next
Next
Return
Die Routine funktioniert, wenn ich 8C einsetzte bekomme ich das gleiche Ergebnis wie die CRC8-Routine berechnet.
Setze ich aber die 1D ein bekomme ich nicht das richtige Ergebnis nach J1850 zurück. Hat SAE J1850 noch andere Eigenheiten von denen ich nichts weiß? Habe hier noch zwei Beispiele von kompletten Datensätzen, das letzte Byte ist die CRC die zurückkommen müsste.
'A2 82 50 00 00 00 00 00 00 00 4D
'B2 D0 E0 70 00 00 00 00 00 00 88
Bitte helft mir - Google ist schon heißgelaufen und in der Suche hab ich auch nichts weiteres gefunden.
Gruß Frank
auf Empfehlung bin ich nun hier im Robonetz gelandet - wenn es hier keine Lösung gibt geht es nicht, hieß es ;-)
Mein Problem: Ich muss eine CRC-Checksumme nach SAE J1850-Standart über 10 Datenbytes erstellen. Die Bascom-CRC-Routine kann ich nicht nehmen weil sie 8C (Dallas) als Generatorpolynom nimmt. Nach Wiki muss ich 1D als Polynom nehmen. Also hab ich mir eine Routine geschrieben bei der ich das Polynom frei einsetzen kann:
Dim Ar(10) As Byte
Dim Temp1 As Byte ' Temporäre Variable
Dim Temp2 As Byte ' Temporäre Variable
Dim X As Byte
Dim Crc As Byte
Dim Crcpoly As Byte
Dim Bytecounter As Byte
Dim Bitcounter As Byte
Ar(1) = &HB2
Ar(2) = &HD0
Ar(3) = &HE0
Ar(4) = &H70
Ar(5) = &H00
Ar(6) = &H00
Ar(7) = &H00
Ar(8) = &H00
Ar(9) = &H00
Ar(10) = &H00
Crcpoly = &H1D
Gosub Calc_crc
Print Hex(crc)
Crc = Crc8(ar(1) , 10)
Print Hex(crc)
End
Calc_crc:
Crc = 0
For Bytecounter = 1 To 10
Temp2 = Ar(bytecounter)
For Bitcounter = 0 To 7
Temp1 = Temp2 Xor Crc
Temp1 = 1 And Temp1
Shift Crc , Right
Crc = Crc And &HFF
Shift Temp2 , Right
Temp2 = Temp2 And &HFF
If Temp1 <> 0 Then
Crc = Crc Xor Crcpoly
End If
Next
Next
Return
Die Routine funktioniert, wenn ich 8C einsetzte bekomme ich das gleiche Ergebnis wie die CRC8-Routine berechnet.
Setze ich aber die 1D ein bekomme ich nicht das richtige Ergebnis nach J1850 zurück. Hat SAE J1850 noch andere Eigenheiten von denen ich nichts weiß? Habe hier noch zwei Beispiele von kompletten Datensätzen, das letzte Byte ist die CRC die zurückkommen müsste.
'A2 82 50 00 00 00 00 00 00 00 4D
'B2 D0 E0 70 00 00 00 00 00 00 88
Bitte helft mir - Google ist schon heißgelaufen und in der Suche hab ich auch nichts weiteres gefunden.
Gruß Frank