Calcul du checksum

Bonjour à tous,

Je rame un peut pour éffectuer le calcul du checksum sur une trame LIN.

voici mon code:

void getlin() {


  static boolean recvInProgress = false;  //Commence le début de réception d'une trame
  static byte ndx = 0;
  int startmarker = 0x0;                  //Une trame commence toujours pas 0x0, on le définit comme marquer de début
  byte rb;

  while (Serial1.available() > 0 && newData == false) {
    curByteMicros = millis();                //On recherche le temps mort entre 2 trames LIN
    if (curByteMicros - prevByteMicros >= linbusInterval) {
      recvInProgress = false;
      receivedBytes[ndx] = '\0';
      numReceived = ndx;
      ndx = 0;
      newData = true;
     
    }
    prevByteMicros = curByteMicros;
    rb = Serial1.read();
    recvInProgress = true;

    if (recvInProgress == true) {
      receivedBytes[ndx] = rb;
      ndx++;
      if (ndx >= numBytes) {
        ndx = numBytes - 1;
      }
    }

  }
}

Je récupère un total de 11 byte.
byte 0 = Marqueur de début = 0x00
byte 1 = Byte de synchronisation = 0x55

byte 2 = identification de la trame
byte 3 à 10 = message
byte 11 = checksumm

Le checksumm est calculé comme suit:

  • On fait la somme des byte de 2 à 10
  • Lorsque la valeur dépasse 8bit (0xFF), on retire le bit de poids fort (carry), et on le réajoute
    exemple: 0x9f + 0x93 = 0x132
    --> 0x33
    ainsi de suite jusqu'à l'addition des 10 byte

on inverse ensuite le résultat obtenu: si sum = 0x50, le chk = 0xAF

Je ne parviens pas à trouver une formule pour éffectuer le chk sur mon résultat:
receivedBytes[2] à receivedBytes[10]

PS: dans mon code, je n'utilise pas les marqueur pour détecter une trame, mais le timout entre 2 trames.
dans mon cas 4 milli secondes.

D'avance, merci pour une éventuelle réponse.

La spécification LIN 2.0 définit le processus de calcul de la somme de contrôle comme étant l'addition de toutes les valeurs et la soustraction de 255 à chaque fois que la somme est supérieure ou égale à 256 (contrairement à modulo-255 ou à modulo-256). D'après la spécification LIN 2.0, la somme de contrôle classique est à utiliser avec les nœuds esclaves LIN 1.3 et la somme de contrôle améliorée est à utiliser avec les nœuds esclaves LIN 2.0. Elle spécifie également que les ID 60 à 63 devraient toujours utiliser la somme de contrôle classique. L'interface NI LIN offre un attribut pour fixer le type de somme de contrôle, classique ou améliorée. La valeur par défaut est classique. D'après la spécification LIN 2.0, les ID 60 à 63 utilisent toujours la somme de contrôle classique, quelle que soit la valeur de l'attribut de somme de contrôle.

faites la somme dans une variable 16 bits, comme ça si vous trouvez que ça dépasse 255 (0xFF) vous retirez ces 255 256 vous retirez 255

j'ai pas lu qu'il fallait ajouter 1

Ce que je lis c'est : si supérieur ou égal à 256 (0x100) ôter 255,c'est à dire ôter 256 et ajouter 1

C'est ce que dit l'OP

Au final c'est équivalent à faire la somme de tous les bytes, et à la fin ajouter au reste de la division par 256 le quotient de cette division

Check = sum/256 + sum%256 ;

Ah oui mal lu :slight_smile:

La somme et modulo oui si les 16 bits n’ont pas débordé - sur une trame de 10 octets aucun risque