我正在用Python 3编写一个应用程序,该应用程序使用pyserial模块通过串行端口与设备进行通讯。
在写入设备时,pyserial模块期望数据以字节序列表示。
如果我一次写入所有数据,则工作正常,但如果逐字节写入数据,则失败,每个字节后都有延迟。我想逐字节写入的原因是当我不得不处理只能以低速率处理数据的设备时。
我使用的代码是:
def write_timed(self, data):
"""Write data to serial port,
taking into account inter-character delay and line-delay
:param data (str): string to write; any escaped characters will be converted
e.g. \n will be output as a newline (not as characters '\' and 'n')
"""
# convert raw string to sequence of bytes
data = bytes(data.encode('latin-1').decode("unicode_escape"), "latin-1")
logging.info("TX:{}".format(repr(data)))
# only write to device if we have something to write
if data:
if data and self.char_delay_s == 0:
self.serial.write(data)
else:
for d in data:
self.serial.write(d)
time.sleep(self.char_delay_s)
time.sleep(self.line_delay_s)
# ensure all data has gone out
self.serial.flush()
我得到的错误是:
File "C:\projects\maintenance\protocoltest\protocoltest\device\device.py", line 65, in write_timed
self.serial.write(d)
File "C:\projects\newplatform\venv3_pyside2\lib\site-packages\serial\serialwin32.py", line 301, in write
data = to_bytes(data)
File "C:\projects\newplatform\venv3_pyside2\lib\site-packages\serial\serialutil.py", line 61, in to_bytes
for item in seq:
TypeError: 'int' object is not iterable
发生错误的原因是,当我执行for d in data:
时,变量d变为int
,而不是长度为1的字节序列。
如果我尝试使用d = bytes(d)
修复该问题,则会得到一串零,即d值的长度。
如何将单个字节写入pyserial?
如果将self.char_delay_s
设置为零,即使长度为1的字符串也可以正常工作。如果我的值非零,则获取上面的错误。
答案 0 :(得分:2)
不幸的是,正如您发现的那样,在索引bytes
对象时,您会得到一个int
对象。最简单的方法是将int
强制转换回bytes
:
for d in data:
d = bytes([d])
# d is now a bytes object and can be used as such
或者,您可以使用切片而不是建立索引:
for i in range(len(data)):
d = data[i : i + 1]
# d is a bytes object because it's a slice of a bytes object