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

Schreibe einen Kommentar