Besoin d'explication pour fonction

Bonjour à toutes et à tous,

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.

Cordialement.

"%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.

Merci beaucoup pour ta réponse ! J'ai modifié le commentaire au passage.

Penses tu pouvoir m'expliquer le : "chk ^= (byte) *i

Merci encore :stuck_out_tongue:

Bonjour Matth78300,

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