Hallo Leutz, ich ärger mich seit Tagen mit der Validierung der CRC32 Prüfsumme von der GPS Zeichenkette aus dem UM982 GPS Modul herum.
char _buffer[600];
uint16_t _buffer_pos = 0;
char _buffer_crc[9];
uint8_t _buffer_crc_pos = 0;
bool writeCRC = false;
static const uint32_t CRC32_POLYNOMIAL = 0xEDB88320;
void setup() {
Serial3.begin(115200);
Serial.begin(9600);
}
uint32_t crc32Value(uint32_t crc) {
for (int i = 8; i > 0; i--) {
if (crc & 1) {
crc = (crc >> 1) ^ CRC32_POLYNOMIAL;
} else {
crc >>= 1;
}
}
return crc;
}
uint32_t calculateCRC32(uint32_t length, uint8_t *buffer, uint32_t crc) {
while (length-- != 0) {
crc = ((crc >> 8) & 0x00FFFFFFL) ^ (crc32Value(((uint32_t)crc ^ *buffer++) & 0xff));
}
return crc;
}
bool crcCorrect() {
const uint32_t crc_calculated = calculateCRC32(_buffer_pos, (uint8_t *)_buffer, 0);
const uint32_t crc_parsed = (uint32_t)strtoul(_buffer_crc, nullptr, 16);
return (crc_calculated == crc_parsed);
}
void printCRC(bool _b) {
if (_b) {
Serial.println("CRC korrekt");
} else {
Serial.println("CRC nicht korrekt");
}
}
void loop() {
if (Serial.available() > 0) {
String receivedString = Serial.readString();
Serial.print("Received: ");
Serial.println(receivedString);
Serial3.write(receivedString.c_str());
}
if (Serial3.available()) {
char c = Serial3.read();
switch (c) {
case '#':
case '$':
{
writeCRC = false;
_buffer_pos = 0;
_buffer_crc_pos = 0;
_buffer[_buffer_pos++] = c;
}
break;
case '*':
{
_buffer[_buffer_pos] = '\0';
writeCRC = true;
}
break;
case '\r':
case '\n':
{
_buffer_crc[_buffer_crc_pos] = '\0';
if (!crcCorrect()) {
return printCRC(false);
} else {
return printCRC(true);
}
}
default:
{
if (writeCRC) {
_buffer_crc[_buffer_crc_pos++] = c;
if (_buffer_crc_pos >= 8) {
_buffer_crc[_buffer_crc_pos] = '\0';
if (!crcCorrect()) {
return printCRC(false);
} else {
return printCRC(true);
}
}
} else {
_buffer[_buffer_pos++] = c;
}
}
}
}
}
Ich bin erst davon ausgegangen, dass eventuell meine Serielle Verbindung bereits Fehlerhaft ist. Aber im Reverenz Manual gibt es eine Beispiel Zeichenkette und diese funktioniert auch nicht.
Also muss es am Algorithmus liegen.
Ich hatte schon mal ärger mit einer Prüfsummen Berechnung, da lag es am ende an der Bitreihenfolge. Die Bitreihenfolge sollte aber in diesem Fall trivial sein.
Ich hoffe das hier jemand Ahnung hat.
Asso, ich bin auf einem Teensy 4.1 zu Gange, also ein IMXRT1062 Mikrocontroller.
MfG FlatBed