Vous ne voulez pas de parité. Vous voulez une communication plus fiable.
La raison pour laquelle la parité est peu utilisée est qu'elle est chère en termes de débit de données. Cela commence par rendre une trame presque 10% plus longue: bit de départ + 8 bits de données + parité + bit d'arrêt = 11 bits au lieu de 10. Mais c'est bien pire que cela. Si vous avez un moyen de savoir si vous avez correctement reçu les données, vous avez le devoir de faire quelque chose avec cela. Ignorer simplement la communication erronée ne suffira pas; l'émetteur doit le renvoyer. Il a donc besoin de savoir s'il a été bien reçu. Vous devrez envoyer un accusé de réception ( ACK
/ NAK
) après chaque octet, et l'émetteur ne peut pas envoyer l'octet suivant avant d'avoir reçu le ACK
. Si vous utilisez des codes ASCII, c'est 11 bits de retour. Donc, cela réduit de moitié le débit, et nous avons déjà perdu 10%, donc nous sommes maintenant à une efficacité de la charge utile de 36% , contre 80%. Et c'est la raison pour laquelle personne n'aime vraiment la parité.
Remarques:
1. Vous n'avez pas besoin d'accuser réception d'un accusé de réception; la distance de Hamming entre les codes ASCII pour ACK
et NAK
est de 3 (avec une parité même 4), donc une erreur dans la réception de ACK / NAK
peut être non seulement détecté, mais aussi corrigé .
2. De nombreux UART peuvent fonctionner avec des longueurs de données allant jusqu'à 5 bits, et il est possible de passer à 5 bits pour envoyer l ' ACK
, mais ce n'est qu'une simple vitrine, et cela ne fait que compliquer la communication.
Une meilleure solution peut être d'utiliser un CRC à la fin de chaque bloc. Les CRC sont meilleurs que les bits de parité pour capturer plusieurs erreurs (mais ils ne peuvent toujours pas les corriger). Une efficacité améliorée ne peut être obtenue que pour de longs blocs; si un bloc se compose de seulement 2 octets, il ne sert à rien d'ajouter un CRC 8 bits.
Un autre inconvénient serait que vous devez quand même accuser réception de la bonne réception. Alors ce n'est probablement pas ça non plus.
Que diriez-vous des codes auto-corrigés ? Les codes de hamming ajoutent peu de frais généraux et vous permettent de corriger vous-même 1 bit erroné; plus besoin de reconnaître. Comme les CRC, les codes de Hamming sont plus efficaces sur des blocs plus longs; le nombre de bits supplémentaires est défini comme étant
\ $ N + H < 2 ^ H \ $
où N = nombre de bits de données, et H = nombre de bits de Hamming. Donc, pour corriger 1 bit dans une communication 8 bits, vous devez ajouter 4 bits de Hamming; un cinquième bit de Hamming n'est requis qu'à partir de 12 bits de données. C'est le moyen le plus efficace de détection / correction d'erreurs sur des messages courts (quelques octets), bien qu'il nécessite un peu de jonglage avec vos données: les bits de Hamming doivent être insérés à des positions spécifiques entre vos bits de données.
Maintenant, avant d'ajouter les codes de correction d'erreur de Hamming, il vaut la peine de regarder dans votre configuration. Vous pouvez vous attendre à des erreurs sur une ligne de 100 m passant entre des machines lourdes, mais vous ne devriez pas avoir d'erreurs sur une ligne de 2 cm. S'il capte du bruit, c'est peut-être une impédance trop élevée. Les conducteurs poussent / tirent-ils? Si c'est le cas, ils devraient pouvoir vous donner des bords rapides, sauf si votre "câble" est capacitif, ce qui ne sera pas à cette courte distance. Existe-t-il des traces de courant élevé parallèles aux lignes de données? Ils pourraient provoquer du bruit. Avez-vous vraiment besoin de cette vitesse élevée et les horloges des deux côtés correspondent-elles assez étroitement? Ralentir à 57600 bits par seconde peut résoudre le problème.