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!
Vous devez vous connecter pour publier un commentaire.
La première chose que vous devez comprendre, c'est que le mod 256 est la même chose que de regarder le bas de journal(256) => 8 bits.
Pour comprendre cela, vous devez d'abord se rendre compte que ce mod' opération et de la façon dont les chiffres sont représentés dans le matériel.
Mod est le reste d'après une ancienne école de la division (c'est à dire uniquement avec des nombres entiers).
par exemple 5%2 = 1
Chiffres matériels sont stockés dans des "bits" qui peut être interprété comme la base de 2 les mathématiques.
Donc si vous voulez prendre le mod opération d'une puissance de 2 vous n'avez pas à faire toute mathématiques.
C'est juste comme si vous voulez avoir le reste de la puissance de 10, il suffit de prendre les chiffres inférieurs.
ie. 157 % 100 = 57.
Ce peut être accéléré en utilisant le fait que les octets doivent débordement par eux-mêmes. Cela signifie que tout ce que vous avez à faire pour prendre %256 d'une série de nombres est de les ajouter à un seul octet et l'arduino va prendre soin de tout le reste.
Pour deux compliment voir cette question:
Qu'est-ce que “Complément de 2”?