hallo zusammen, Für die Implementierung des SENT-Protokolls sind die Datenbytes 6, also 24-Bit-Daten, einschließlich eines Statushalbbytes, eines CRC-Halbbytes und eines Pausenimpulses. Ich muss den CRC für 6 Daten-Nibbles berechnen. Der erste Wert für die CRC-Berechnung ist, wie ich weiß, 5. Aber wenn ich das Signal mit Ozs dekodiere. bekomme ich einen Fehler in der Nachricht, weil ich zufällige Werte für CRC und für Status-Nibble sende. nun zu meinen Fragen: Wie kann ich den CRC-Wert und die Status-Nibbles berechnen? ich habe den folgenden code gefunden: uint8_t calculatedCRC, i; const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11, 15, 2, 8, 5}; calculatedCRC = 5; // initialize checksum with seed "0101" for (i = 0; i < 6; i++) { calculatedCRC = CrcLookup[calculatedCRC]; calculatedCRC = (calculatedCRC ^ Data[i]) & 0x0F; } // One more round with 0 as input calculatedCRC = CrcLookup[calculatedCRC]; aber wenn ich die For-Schleife wie folgt folge,dann ist dies nach der ersten Iteration nicht möglich, da der berechnete calculatedCrc wird 11 ^ 11 sein . Ich brauche eure Hilfe, bitte! 1) i=0 >>> calculatedCRC== 11 2) i=1 >>> calculatedCRC== 3) i=2 >>> calculatedCRC 4) i=3 >>> calculatedCRC 5) i=4 >>> calculatedCRC 6) i=5 >>> calculatedCRC
1. In der Schleife wird auf Data[] zugeriffen, wenn Du wirklich jemand dazu bekommen solltest, die sechs einfachen Schritte fuer Dich zu tun, sollte das nicht fehlen. 2. Ich vermute, Dein Problem liegt tiefer, das "^" denotiert ein EXOR.
Tiramisu schrieb: > Ich vermute, Dein Problem liegt tiefer, das "^" denotiert ein EXOR. Ach mensch. das ist nicht 11 hoch 11.danke dir
könntest du mir bitte sagen, wie man auf diese Tabelle kommen kann ? const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11, 15, 2, 8, 5};
Sam schrieb: > wie man auf diese Tabelle kommen kann 1 die "SAE J2716" Norm 2 https://electronics.stackexchange.com/questions/284195/sent-crc-calculation 3 http://www.ross.net/crc/download/crc_v3.txt mfg mf
:
Bearbeitet durch User
Sam schrieb: > könntest du mir bitte sagen, wie man auf diese Tabelle kommen kann ? Anbei ein kleines Python Script, welches die Tabelle erzeugt. EINgabgrößen sind die Bitlänge des CRC und das Polynom. Insofern kann es leicht für andere Polynome und Bitlängen verwendet werden. Hinweis: Im kommentar steht ^ für Potenzieren, im Code für XOR.
1 | bits = 4 |
2 | polynome = 0b1101 # (x^4 +) x^3 + x^2 + 1 (1 is x^0 -> lowest bit set, x^4 is implicit set) |
3 | |
4 | uprmask = 1 << (bits - 1) # Masking the upper bit of the crc |
5 | entries = 2 ** bits |
6 | crcmask = entries - 1 |
7 | crctab = bytearray(entries) |
8 | |
9 | |
10 | for i in range(entries): |
11 | crc = i |
12 | for _ in range(bits): |
13 | crc = ((crc << 1) ^ (polynome if (crc & uprmask) else 0)) |
14 | crctab[i] = crc & crcmask |
15 | |
16 | print("crc%d_tab = (" % bits, end="") |
17 | for i in range(entries): |
18 | print("%d" % crctab[i], end="") |
19 | if (i == (entries - 1)): |
20 | print(")") |
21 | elif ((i % 16) == 15): |
22 | print(",\n ", end="") |
23 | else: |
24 | print(", ", end="") |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.