2.Si j'essaie de comprendre ce que tu expliques, barbudor, il serait possible de communiquer et donc lire les infos envoyées par l'arduino en 8 bits comme "habituellement" ?
Ou alors je capte pas ?
Une transmission série 7-bit + parité est en fait une transmission -bit avec :
- 7 bit utiles dans les poids faibles (bit 0 à bit 6)
- 1 bit de parité c'est à dire un bit qui permet de vérifier la validité de l'octet pour se prémunir d'erreurs de transmission.
Le bit de parité est calculé de telle façon que :
- Parité Paire : la somme de tous les bits de l'octet y compris la parité est un nombre pair
- parité Impaire : la somme de tous les bits de l'octet y compris la parité est un nombre pair
Normalement, quand tu utilise une fonction série matérielle telle que le Serial de l'Arduino, c'est le composant qui gère cela.
Il va recevoir les 8 bits, vérifier la parité. Si la vérification de parité est ok, il masque le 8eme bit (parité) et remonte au code (lib HardwareSerial de l'Arduino) un octet dont le 8eme bit est toujours à zéro. Si la vérification est ko, il jète l'octet.
Résultat sur un message complet dont certains caractères sont erronés, tu ne reçoit pas les caractères erronés. Ca te fait une belle jambe parce que quand il manque des caractères "on n cmprd ps tot c qu di l'are" (on ne comprend pas tout ce que dit l'autre

)
Donc le message est pourris de toute façon....
Autant ne pas tenir compte de la parité, laisser les caractères faux arriver et utiliser autre chose pour valider le message tel qu'un checksum par exemple.
La lib SoftwareSerial elle ne fait pas cette distinction. Elle reçoit les 8 bits et retourne à l'application les 8 bits que le 8eme bit soit un bit utile ou un bit de parité.
Le problème c'est que par exemple (exemple en parité paire) si pour le caractère 'A' code ASCII 65 (0x41), tu va bien recevoir 0x41 (2 bits sont à 1, le bit 0 et le bit 6) pour le caractère 'C' code ASCII 67 tu va recevoir 0xC3. Le transmetteur aura positionné le 8eme bit a 1 de façon que le nombre de bits à 1 soit pair (bits 0, 1, 6 et 7).
Il suffit donc de masquer chaque octet reçu par un "& 0x7F" (c'est la même chose que "& ~_BV(7)" et voilou.
Est-ce clair ?