如何创建长度为1的bytes()序列

时间:2019-01-23 19:49:27

标签: python-3.x string pyserial

我正在用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的字符串也可以正常工作。如果我的值非零,则获取上面的错误。

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