J'ai récemment écrit, à l'aide d'internet et de mes connaissances, un programme me permettant de calculer automatiquement un checksum voici une partie :
void display(const char *msg)
{
char buf[100]; //mémoire tampon (buffer)
strcpy(buf, "<ID00><L1><PA><FE><MA><WC><FE>"); //copie buf vers la trame
strcat(buf, msg); //ajoute buf à la fin du message
byte chk = 0;
char *i;
for (i = buf + 6; *i; i++) // calcule le checksum
chk ^= (byte) * i;
sprintf(i, "%02X<E>", chk); // ajoute le checksum et le code de fin
mySerial.println(buf);
}
J'aurais besoin d'une petite explication sur 2-3 bouts de programme, comme :
"%02X" tout ce que je sais c'est que le "" est la fin de ma trame mais le "%02X% je ne saurais pas l'expliquer
Si quelqu'un sait déjà m'expliquer ceci ça serait super pour moi merci d'avance à toutes et à tous.
"%02X" écrit la valeur de chk en hexadécimal sur 2 digits suivit de
au passage,
strcat(buf, msg); //ajoute buf à la fin du message
le commentaire est faux
c'est msg qui est ajouté à la fin de buf
autre chose le checksum est ajouté à la fin de buf sans aucun contrôle. Si msg est trop long tu vas déborder de buf et écraser les variables qui sont derrière lui.
C'est une mauvaise idée d’appeler un pointeur i (bien que ce ne soit pas interdit). Conventionnellement i est utilisé pour les compteurs ou index
Tu aurais du conserver le code que je t'avais indiqué tel quel
char *p;
for (p = buf + 6; *p; p++) // calcule le checksum
chk ^= (byte) * p;
p (comme pointeur) c'est un pointeur (c'est à dire l'adresse dans le buffer)
*p c'est la valeur de la variable char pointée par ce pointeur
comme on doit faire le checksum avec des bytes on le cast en byte -> (byte) *p pour avoir des valeurs toujours positives
donc chk ^= (byte) * p; fait un ou exclusif entre chk et la valeur byte pointée par p et le range dans chk.
Si tu es allergique aux pointeur ça peut aussi être écrit avec des index:
for (int i=6; buf[i]!=0; i++)
chk^=(byte) buf[i];
Mais en général, c'est moins efficace qu'avec des pointeurs