Berechnung von Modbus RTU CRC 16

8

Ich implementiere eine Software, wo ich Daten im Modbus RTU-Protokoll über serielle Daten lesen und schreiben kann. Dafür muss ich das zwei CRC-Byte am Ende der Bytefolge berechnen, aber ich bin dazu nicht in der Lage.

Beim Suchen im gesamten Web habe ich zwei Funktionen gefunden, die die CRC korrekt zu berechnen scheinen:

%Vor%

Und

%Vor%

Das Problem ist, dass ich zwei Hex-Bytes als CRC-Nummern erhalten soll, während diese Funktion einen ganzzahligen Wert zurückgibt. Zum Beispiel, für "01" (1 Byte), sollte ich eine "7E80" erhalten, während ich "21695" bekomme, und ich bin nicht in der Lage, eine Art von Konvertierung von diesem zu diesen Hex-Daten zu machen.

>

Meine Frage lautet daher: Wie gehe ich vom Integer-Ergebnis zum Doppelhex-Ergebnis? Ich habe ein paar Möglichkeiten ausprobiert, ohne Erfolg.

Ich bin froh um jede Hilfe,

Momergil.

Hinweis: Ich verwende Qt. Wenn Sie also eine Lösung finden, die QByteArray oder einen anderen Qt-freundlichen Code implementiert, werde ich froh sein. So oder so ist eine Lösung, die Qt, C oder C ++ nicht verwendet, nutzlos: P

    
Momergil 13.10.2013, 16:48
quelle

4 Antworten

3

Laut MODBUS über die serielle Spezifikation und Implementierungshandbuch V1.02 wird der CRC als Little-Endian gesendet (niedrig Byte zuerst).

Ich habe jedoch keine Ahnung, wie Sie dazu gekommen sind, irgendwelche hexadezimalen Bytes für den CRC zu benötigen. MODBUS RTU ist ein binäres Protokoll, und der CRC wird als zwei Bytes gesendet, nicht als vier hexadezimale Ziffern!

Gehen Sie folgendermaßen vor: Verwenden Sie die von Ihnen bereitgestellte CRC16-Funktion.

%Vor%     
Kuba Ober 13.10.2013, 17:06
quelle
6
%Vor%

ich bin irgendwie ein Noob, butttt -

Ich habe den mitgelieferten Code benutzt und habe ihn selbst getestet, und wie du sagtest, hat es nicht richtig funktioniert, aber dann habe ich gemerkt, dass hex chars übergeben wurde, also habe ich nur uint in char geändert und es sucht zumindest nach mir.

Ich habe sogar eine Probe von Hand berechnet, um sie zu überprüfen.

    
Adam Lam 15.11.2013 06:31
quelle
2

Ich habe versucht, das erste Codebeispiel zu verwenden, das Sie hier gepostet haben (das mit Tabelle), und ich habe herausgefunden, dass es einen Fehler bei der Verwendung von index gibt. Damit der Code korrekt ausgeführt wird, müssen Sie auf die Tabelle in dem durch die Größe begrenzten Bereich zugreifen.

%Vor%

Der gesamte Code, der den korrekten Wert von CRC16 für MODBUS zurückgibt, ist unten aufgeführt. Die zurückgegebene Zahl hat Lo und Hi Byte bereits getauscht.

%Vor%     
Michal Fiala 14.08.2014 06:44
quelle
0

Hier sind meine zwei Cent. Das erste, was Sie können zwei Werte zu einer Funktion so

zurückgeben
  1. Fügen Sie dem Array zwei Werte hinzu (denken Sie daran, const zu entfernen)
  2. Gibt eine Struktur zurück, die diese beiden Werte enthält.
  3. Verarbeiten Sie den Rückgabewert wie folgt

    %Vor%

Versuchen Sie es und lassen Sie es mich wissen.

    
Devidas 12.12.2016 14:00
quelle

Tags und Links