web-dev-qa-db-ja.com

Pythonを使用してバイト配列をシリアルポートに送信するにはどうすればよいですか?

Pyserialモジュールを使用して、バイト配列をシリアルポートに送信する必要があるアプリケーションに取り組んでいます。私はキャノピーでこれを行うためのコードを正常に実行しています:

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

しかし、Spyderで同じコードを実行すると(両方ともPython 2.7.6)実行されています)、次のようなエラーメッセージが表示されます。

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

この点でSpyderをCanopyのように動作させるにはどうすればよいですか?

6
W. Stine

エラーは、ser.write()に渡されたオブジェクトのタイプが原因で発生したようです。 Spyderではバイト配列ではなくリストとして解釈されるようです。

値をバイト配列として明示的に宣言してから、シリアルポートに書き込みます。

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)

編集:タイプミスの修正。

8
Johan E. T.

bytearrayを作成する(ただし、strへの変換も必要になる場合があります)。

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