web-dev-qa-db-fra.com

Comment envoyer un tableau d'octets à un port série en utilisant Python?

Je travaille sur une application qui nécessite l'envoi d'un tableau d'octets vers un port série, à l'aide du module physique. J'ai réussi à exécuter du code pour le faire dans la canopée:

import serial
ser = serial.Serial('/dev/ttyACM0', 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE)
ser.write([4, 9, 62, 144, 56, 30, 147, 3, 210, 89, 111, 78, 184, 151, 17, 129])
Out[7]: 16

Mais lorsque j'exécute le même code dans Spyder (les deux exécutent Python 2.7.6), j'obtiens un message d'erreur, comme

import serial
ser = serial.Serial('/dev/ttyACM0', 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE)
ser.write([4, 9, 62, 144, 56, 30, 147, 3, 210, 89, 111, 78, 184, 151, 17, 129])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 475, in write
n = os.write(self.fd, d)
TypeError: must be string or buffer, not list

Comment puis-je faire en sorte que Spyder se comporte comme Canopy à cet égard?

6
W. Stine

Il semble que l'erreur soit due au type d'objet transmis à ser.write (). Il semble qu'il soit interprété comme une liste et non comme un bytearray dans Spyder.

Essayez de déclarer les valeurs explicitement en tant que bytearray, puis écrivez-les sur le port série:

import serial
ser = serial.Serial('/dev/ttyACM0', 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE)

values = bytearray([4, 9, 62, 144, 56, 30, 147, 3, 210, 89, 111, 78, 184, 151, 17, 129])
ser.write(values)

edit: Correction des fautes de frappe.

8
Johan E. T.

En créant un bytearray (bien que vous deviez également convertir en str).

>>> bytearray([1, 2, 3])
bytearray(b'\x01\x02\x03')
>>> str(bytearray([1, 2, 3]))
'\x01\x02\x03'
0