Wie die Berechnung einer 256-modulo-Prüfsumme auf arduino
Ich Schreibe ein computer-Programm, das verwendet input von einige Geräte, die ich selten habe availible in meinem Büro. Um die Entwicklung und den test dieser Programm ich versuche, mit einem Arduino-board zu simulieren, die Mitteilung der tatsächlichen Ausrüstung. Zu diesem Zweck erstelle ich Datenpaketen befassen, die auf dem Arduino und senden Sie Sie an meine computeer über den seriellen port. Die Pakete sind formatiert als eine header-und eine hexadezimale Ganzzahl, die einige sensor-Daten.
Header enthalten soll, eine checksum (2er-Komplement 256-modulo). Ich bin jedoch nicht sicher, wie man es berechnet. Im Datenblatt des Geräts, die Kommunikation, die ich versuche zu simulieren), es wird angegeben, dass sollte ich zuerst berechnen der Summe aller bytes in dem Paket, und nehmen Sie dann die 256-modulo der Summe und führen ein 8-bit-Zweierkomplement auf das Ergebnis.
Jedoch als ich bin ein Neuling auf bits, bytes und serielle Kommunikation, die ich nicht verstehe Folgendes:
1) sagen wir, ich will senden den Wert 5500 als zwei bytes (high-byte und low-byte). Dann das high-byte '15' und die low-byte ist '7c' in hexadezimal-Codierung, das entspricht 21 und 124 in dezimale Werte. Ich fügen Sie dann die Beiträge 21 und 124, um die Prüfsumme vor der Einnahme der 256-modulo, oder mache ich etwas wenig-Magie vorher?
2) Wie führe ich ein zweier Kompliment?
Hier ist ein code, die illustrieren sollten, wie ich finde. Die Idee ist, ein Paket zu senden, mit einem header mit einem byte, das gibt die Länge des Pakets, ein byte-die Staaten den Typ des Pakets, und ein byte für die Prüfsumme. Dann ein zwei-byte-integer-Wert repräsentiert ein sensor Wert teilt sich in ein high-byte und low-byte übertragen und low-byte zuerst.
int intVal;
byte Len = 5;
byte checksum;
byte Type = 2;
byte intValHi;
byte intValLo;
void setup(){
Serial.begin(9600);
}
void loop(){
intVal = 5500; //assume that this is a sensor value
intValHi = highByte(intVal);
intValLo = lowByte(intVal);
//how to calculate the checksum? I unsuccessfully tried the following
checksum = 0;
checksum = (Len+checksum+Type+intValHi+intValLo) % 256;
//send header
Serial.write(Len);
Serial.write(checksum);
Serial.write(Type);
//send sensor data
Serial.write(intValLo);
Serial.write(intValHi)
}
Dank!
InformationsquelleAutor user3774617 | 2014-06-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Sache, die Sie verstehen sollten, ist, dass die mod 256 ist die gleiche Sache wie Sie sich auf der Unterseite log(256) => 8 bits.
Zu verstehen, muss man zuerst erkennen, was der 'mod' - Betrieb gibt und wie Ziffern dargestellt werden, in hardware.
Mod ist der Rest nach ein old-school-division (also nur mit ganzen zahlen).
z.B. 5%2 = 1
Ziffern in der hardware gespeichert sind in 'bits', die interpretiert werden kann als Basis 2 Mathematik.
Also, wenn Sie wollen, nehmen Sie die mod-operation mit einer Leistung von 2 Sie haben tatsächlich nicht zu tun, keine math.
Das ist so, wie wenn Sie wollen, um den Rest der Potenz von 10, die Sie gerade, die unteren stellen.
ie. 157 % 100 = 57.
Dies kann beschleunigt werden durch Verwendung der Tatsache, dass die bytes sollten überlauf von selbst. Dies bedeutet, dass alles, was Sie zu tun haben, nehmen %256 von einer Reihe von zahlen ist, um Sie in einem einzigen byte und der arduino kümmert sich um den rest.
Für zweier-Kompliment sehen diese Frage:
Was ist "2-Komplement"?
InformationsquelleAutor Treesrule14