Comment calculer une 256-modulo somme de contrôle sur arduino

Je suis en train d'écrire un programme d'ordinateur qui utilise l'entrée de certains équipements qui j'ai rarement disponibles dans mon bureau. Afin de développer et de tester ce programme, je suis en train d'utiliser une carte Arduino pour simuler la communication de l'équipement réel. À cet effet, je créer datapackets sur l'Arduino et de les envoyer à mon computeer sur le port série. Les paquets sont formatée comme un en-tête et un format hexadécimal en nombre entier, ce qui représente des données de capteur.

L'en-tête est censé contenir une somme de contrôle (complément de 2 256-modulo). Je ne suis toutefois pas sûr de la façon de le calculer. Dans la feuille de données de l'équipement (communication, j'essaie de simuler), il est indiqué que je dois d'abord calculer la somme de tous les octets du paquet, puis de prendre le 256-modulo de la somme et d'effectuer une 8 bits en complément à deux sur le résultat.

Cependant, comme je suis un newbie de bits, octets et de communication en série, je ne comprends pas les éléments suivants:

1) Permet de dire que je veux envoyer la valeur de 5500 comme deux octets (high-byte et octet de poids faible). Ensuite, le high-byte est '15" et le low-byte est " 7c " en hexadécimal de l'encodage, ce qui correspond à 21 et 124 en valeurs décimales. Puis-je ajouter les contributions 21 et 124 de la somme de contrôle avant de prendre le 256-modulo, ou dois-je faire quelque peu la magie à l'avance?

2) Comment dois-je effectuer une à deux compliment?

Voici un code qui devrait illustrer la façon dont je pense. L'idée est d'envoyer un paquet avec un en-tête contenant un octet qui indique la longueur du paquet, un octet qui précise le type de paquet, et un octet de somme de contrôle. Puis deux octets entier représentant certaine valeur de la sonde est divisée en haute-octets et un low-byte, et transmis à faible octet de la première.

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)
}

Merci!

InformationsquelleAutor user3774617 | 2014-06-25