/ / pySerial n'aime pas les valeurs basses - Python, port série, microcontrôleur, pyserial, uart

pySerial n'aime pas les valeurs basses - Python, port série, microcontrôleur, pyserial, uart

En jouant avec un MCU, je tente de communiquer via un lien RS232 vers un ordinateur de bureau.

J'ai "fait un programme de test très simple: envoyer "Bonjour tout le monde! N" chaque n Mme.

Les paramètres de connexion de liaison les plus pertinents sont:

  • Port: / dev / ttyUSB0
  • Baudrate: 57600 bps
  • 8 bits de données
  • 1 bit stop
  • Pas de parité et de contrôle du matériel

Pour vérifier que je reçois des données de la MCU vers le PC, j'ai défini / dev / ttyUSB0 avec:

%> stty -F /dev/ttyUSB0 57600 cooked

et alors,

%> cat /dev/ttyUSB0
Hello world!
Hello world!
Hello world!
...

Donc, je reçois correctement les données du MCU.

Mais là le problème, quand je veux utiliser Python avec le module pySerial, les données sont complètement fausses

>>> s = serial.Serial("/dev/ttyUSB0", 57600)
>>> print s
Serial<id=0x195fed0, open=True>(
port="/dev/ttyUSB0", baudrate=57600,
bytesize=8, parity="N",
stopbits=1, timeout=None,
xonxoff=False, rtscts=False,
dsrdtr=False)

>>> s.read(14)
"xc8xe5xecxecxefxa0xf7xefxf2xecxe4xa1x8ax80"

A ce stade, j'ai "changé"Bonjour tout le monde! chaîne de sortie (côté MCU) pour cette chaîne: 0xde, 0xad, 0xbe, 0xef. Et ce que j'obtiens avec pySerial, c'est:

>>> s.read(4)
"xdexadxbexef"

Ça marche! J'ai changé une autre fois, maintenant pour ceci: 0x00, 0x01, 0x02, 0x03, 0x80, 0x81, 0x82, 0x83. Résultat:

>>> s.read(8)
"x80x81x82x83x80x81x82x83"

Conclusion: pySerial modifie la valeur en octets inférieure à 128 pour la même valeur plus 128.

Je ne sais pas pourquoi cela se produit. J'ai utilisé le module pySerial à d'autres occasions (version 2.4) et tout fonctionnait bien. J’ai essayé avec les versions 2.5 et 2.6 sous Ubuntu 11.10 et Ubuntu 10.04 mais cela ne fonctionne pas.

PD: Soyez sympathique avec mon écriture anglaise. Je ne maîtrise pas l'anglais comme je le devrais être.

Réponses:

0 pour la réponse № 1

Ok, ma faute! PySerial fonctionne parfaitement. En révisant le code dans la MCU, j’ai trouvé une erreur qui annulait un bit à définir (j’envoyais une longueur de caractères de 7 bits). Ensuite, la trame reçue était, bien évidemment, partiellement bonne, partiellement fausse.

Maintenant, je peux comprendre pourquoi pySerial me montre malrésultats. Néanmoins, la façon dont mon PC reconstruit à partir de données 7 bits, des caractères de 8 bits, reste un mystère. J'étais absolument convaincu que le code de MCU était correct car les données du terminal étaient correctes: S