Vous ne savez pas comment Arduino interprète le signal RS232

Kevin de Haan

Vous ne savez pas comment Arduino interprète le signal RS232


Avertissement: je suis un novice.

J’ai une connexion RS232 avec un lecteur d’étiquettes RFID que je surveille via un logiciel sur un ordinateur de bureau ainsi qu’un Arduino. Le périphérique est configuré avec la parité 8E1. L’arduino est (à ma connaissance) configuré pour la parité 8N1. L’ordinateur et l’arduino se connectent directement au lecteur et reçoivent exactement le même signal.

L’arduino lit une balise comme suit:

 10 00 62 00 10 29 C0 0F 00 39 12 C0 56 00 8D 0A 

L’ordinateur lit la même balise comme suit:

 30 00 E2 00 30 69 80 0F 00 59 12 80 96 00 0D 0A 

Avec ma compréhension (limitée) de la parité, je ne peux pas comprendre la conversion ici. Comment l’arduino interprète-t-il ces bits pour obtenir ces valeurs?

Eugene Sh.

Vous devez connaître le protocole de votre lecteur et configurer le récepteur en conséquence. La « conversion » consiste à tout écrire en binaire, à dessiner la forme d’onde correspondante et à réinterpréter en fonction de chacune des configurations.

Tony EE rocketscientist

L’ordinateur est-il identique à la configuration RFID? La parité ne doit pas affecter les résultats car il s’agit du 9e bit et vous voyez des erreurs d’intégrité du signal, vérifiez les bits d’état pour une erreur de parité. Signal de lecture de l’oscilloscope

jsotola

êtes-vous sûr qu’il y a un bit de parité?

Tony EE rocketscientist

Définissez également comment vous envoyez Lsb, ordre msb avec parité et comment vous le recevez supremainc.com/en/node/614

immibis

Avez-vous essayé de visualiser le signal sur votre oscilloscope? N signifie pas de bit de parité.

Réponses


 crépuscule

Votre lecteur de balises envoie des données série avec un bit de parité, et l’Arduino n’est pas configuré pour s’y attendre.

Vous avez deux options:

  1. Configurez l’Arduino pour lire le bit de parité en passant SERIAL_8E1 comme deuxième argument à Serial.begin() . Une fois que vous avez fait cela, les données doivent être reçues normalement.

  2. Configurez l’appareil pour ne pas envoyer de bit de parité. (Le manuel implique que c’est une option.)

La méthode que vous avez trouvée n’est pas optimale. Il est susceptible d’entraîner des erreurs de lecture imprévisibles et dépendantes des données.

Kevin de Haan

Tout dans cette réponse est correct. Malheureusement, j’utilise SoftwareSerial, qui n’a pas le deuxième argument, et le fait de configurer l’appareil pour qu’il n’utilise pas les bits de parité entraîne des problèmes d’utilisation importants lors de la configuration (c’est-à-dire qu’il ne changera pas les paramètres). En fin de compte, une fois que je serai plus confiant dans le reste de mon programme, je passerai probablement à l’utilisation de Serial.begin () avec le paramètre que vous avez décrit.


 Kevin de Haan

Merci pour votre aide.

Après avoir fait quelques recherches avec un oscilloscope, j’ai compris ce qui se passait:

Échantillon de données pures du lecteur (LSB d’abord, espaces ajoutés pour plus de clarté):

 10 0000 11000 10 0000 00000 10 0100 01110 10 1011 00001 10 0101 00000 10 ^s 0 ^3 ^p^s ^0 ^0 ^p^s ^2 ^E ^p^s ^D ^0 ^p^s ^A ^0 ^s 

Pour une valeur de données de

 0 3 0 0 2 ED 0 A 0 -> 30 00 E2 0D 0A 

s est l’indicateur d’arrêt, p est le bit de parité et les autres sont les données hexadécimales. Ce qui se passe sur mon arduino, c’est que le bit de parité est lu comme le bit le plus significatif pour la seconde moitié de l’octet, puis le bit le moins significatif précédent est utilisé pour écraser le nouveau bit le moins significatif de ce demi-octet.

Appliqué à l’exemple précédent:

 11000 -> 1000 00000 -> 0000 01110 -> 0110 00001 -> 0001 00000 -> 0000 

qui produit:

 0 1 0 0 2 6 D 8 A 0 -> 10 00 62 8D 0A 

expliquant la conversion que vous voyez dans mon exemple d’origine aux octets de début et de fin:

 30 00 E2 0D 0A -> 10 00 62 8D 0A 

Si, pour une raison quelconque, quelqu’un d’autre rencontre ce problème incroyablement spécifique, j’ai reconverti les données dans la logique Arduino avec ces fonctions (non, elles ne sont pas optimales):

 byte fixBits(byte rc) { byte five = rc & 0x10; byte six = getParity(rc) << 5; byte hex1 = (rc & 0xF0) << 1; byte hex2 = rc & 0x0F; return ((hex2 | hex1) & 0xCF) | five | six; // bit masking } byte getParity(byte rc) { int sum = 0; byte test = rc; for (int i = 0; i < 8; i++) { sum += test & 1; test >> 1; } return sum & 1; } 

Si quelqu’un peut décrire exactement pourquoi cela se produit, je serais curieux de l’entendre, mais sinon, ce problème est résolu.


 Umar

Le bit de parité ne fera pas partie des données. Si vous avez un oscilloscope ou un plug-in d’analyseur logique et surveillez les bits un par un. Tu comprendras.

entrez la description de l'image ici Ardiino n’est pas configuré pour attendre un bit de parité. Actuellement, arduino signalera des erreurs pour les cas où le bit de parité n’en est pas un. Surveillez les registres d’état d’erreur UART. Arduino s’attend à ce que l’emplacement où le bit de parité est mis (par le lecteur RFID) soit toujours un (bit STOP)

Comment l’ordinateur interprète-t-il ces bits pour obtenir ces valeurs?

L’ordinateur ne fonctionnera pas sur les données reçues. Il extraira les données de la position des bits de données telles quelles. Et calcule ensuite la parité .. Si la parité reçue ne correspond pas à la parité calculée, un indicateur d’erreur de parité sera défini dans le registre d’erreurs. Il appartient alors au programme de vérifier son état chaque fois que les données sont reçues de la RFID.

 

#pas, arduino, comment, interprète, Le, ne, RS232, savez, Signal, vous

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *