Forum: Mikrocontroller und Digitale Elektronik CRC16 korrekt berechnet?


von Spice (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine Frage bzgl. der CRC16 Berechnung einer Bytefolge.

Nehmen wir die Bytefolge[]={0x05,0x06,0x40,0x00,0x00,0x01} an

Wenn ich nun die CRC berechne, komme ich auf einen Wert von 0x4e5c.

Der Wert ist nach folgender Funktion berechnet, allerdings bekomme ich 
von dem Empfänger keine Antwort zurück, wo ich glaube, dass es an der 
Prüfsumme liegen könnte.
1
void calc_crc(unsigned int* pCrc, unsigned char uData)
2
{
3
  int iBit;
4
  for (iBit = 0; iBit < 8; iBit++, uData >>= 1)
5
  {
6
    if ((uData ^ *pCrc) & 0x01)
7
    {
8
      *pCrc >>= 1; 
9
      *pCrc ^= 0xA001;
10
    }
11
    else*pCrc >>= 1;
12
  }
13
}

Kann jemand bestätigen, dass die Prüfsumme korrekt berechnet ist?

Wieso bekommt man bei einer CRC16 Prüfung so viele unterschiedlichen 
Werte für die Prüfsummen? Online-Kalkulatoren geben mir auch immer 
wieder unterschiedliche Werte aus, je nachdem welchen CRC16 man 
auswählt.

Danke und viele Grüße
Spice

von g457 (Gast)


Lesenswert?

> Online-Kalkulatoren geben mir auch immer wieder unterschiedliche Werte
> aus, je nachdem welchen CRC16 man auswählt.

Es gibt nicht "die" crc16. Da [0] gibts eine (unvollständige) Liste. 
Welche Variante brauchst Du denn (für den Empfänger), welche glaubst Du 
implementiert zu haben, und welche hast Du tatsächlich implementiert?

[0] 
https://en.wikipedia.org/wiki/Cyclic_redundancy_check#Polynomial_representations_of_cyclic_redundancy_checks

von g457 (Gast)


Lesenswert?

Nachtrag: mit z.B. pycrc [0] kannst Du dir fertigen Sourcecode erzeugen 
lassen (oder ggf. bruten).

HTH

[0] https://pycrc.org/

von Spice (Gast)


Lesenswert?

Besten Dank für die Infos, aber Wiki hättest du dir sparen können, da 
man hier meistens nur Beiträge eröffnet, wenn entweder die Quellen 
ausgehen, diese nicht verständlich genug für jedermann dargestellt sind, 
oder weil man nicht mehr weiter weiß;-)

CRC16-CCITT sollte hier implementiert sein.

Mein Startwert war bei 0xFFFF, mit 0x0000 klappt es, ispieriert von 
CRC16-ARC...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Zum Gegenrechnen hilft diese Seite hier: https://crccalc.com/
Sehr zu empfehlen ist auch der "checkvalue".
Da füllste den String "123456789" als array obenr ein udn dann muss die 
checkvalue rauskommen (angegeben auf der Seite).

Gibts denn irgendwo eine Doku welcher CRC16 das sein muss?
Von den CRC16 gibts verdammt viele.

edit:
Wenn da 0x4e5c rauskommt, dann ist das CRC16 Modbus.
Willste denn was per Modbus schicken?

: Bearbeitet durch User
von Ingoh (Gast)


Lesenswert?

Spice schrieb:
> da
> man hier meistens nur Beiträge eröffnet, wenn entweder die Quellen
> ausgehen, diese nicht verständlich genug für jedermann dargestellt sind,
> oder weil man nicht mehr weiter weiß;-)

OT:

Da bist Du aber ein Musterschüler. ;)
Mein Eindruck ist oft eher der, dass hier sogar ein Beitrag eröffnet 
wird, bevor man überhaupt das Hirn eingeschaltet hat.

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
Noch kein Account? Hier anmelden.