【问题标题】:pySerial - Only reading one bytepySerial - 只读取一个字节
【发布时间】:2019-01-08 09:20:00
【问题描述】:

我正在尝试使用 pySerial 通过串行方式读取和写入传感器。我没有软件或硬件流控制。

我能够向设备发送一个十六进制字符串,但我只收到一个字节,而不是我应该看到的两到十个字节。传感器正在工作——我已经使用 Realterm 验证了这一点。

我尝试过使用 ser.readline()(而不是 inWaiting 循环)和 ser.read(2);这只会导致程序挂起。我也尝试过增加睡眠时间,并尝试了不同的波特率(在 PC 和传感器上),但似乎没有任何效果。

有人有什么建议吗?

import time
import serial

# configure the serial connections
ser = serial.Serial(
    port='COM1',
    baudrate=115200,
    parity=serial.PARITY_EVEN,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

ser.isOpen()

print 'Enter your commands below.\r\nInsert "exit" to leave the application.'

while 1 :
    # get keyboard input
    data_in = raw_input(">> ")

    if data_in == 'exit':
        ser.close()
        exit()
    else:
        # send the character to the device
        ser.write(data_in.decode('hex') + '\r\n')

        out = ''
        time.sleep(1)
        while ser.inWaiting() > 0:
            out += ser.read(1)

        if out != '':
            print ">>" + " ".join(hex(ord(n)) for n in out)

(我对Full examples of using pySerial package上的代码稍作修改)

【问题讨论】:

    标签: python serial-port pyserial


    【解决方案1】:

    您的读取语句明确要求 1 个字节:

    ser.read(1)
    

    如果您知道要读取多少字节,您可以在此处指定。如果您不确定,那么您可以指定一个更大的数字。例如,做

    ser.read(10)
    

    最多可读取 10 个字节。如果只有 8 个可用,那么它只会返回 8 个字节(超时后,见下文)。

    还值得设置一个超时来防止程序挂起。只需在您的串行构造函数中添加一个超时参数。以下将为您提供 2 秒的超时时间:

    ser = serial.Serial(
        port='COM1',
        baudrate=115200,
        parity=serial.PARITY_EVEN,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=2
    )
    

    文档说明:

    read(size=1) 从串口读取size 字节。如果设置了超时,它可能会根据请求返回更少的字符。没有超时,它将阻塞,直到读取请求的字节数。

    因此,如果您不知道需要多少字节,请设置一个小的超时时间(如果可能),这样您的代码就不会挂起。

    如果您的代码未返回预期的全部字节数,则很可能您连接的设备未发送您预期的所有字节。既然您已经验证它应该单独工作,您是否验证了您发送的数据是正确的?也许首先使用 struct.pack() 编码为字节。例如,发送一个十进制值为 33(十六进制 0x21)的字节

    import struct
    bytes_to_send = struct.pack('B', 33)
    

    我也从未发现有必要在发送之前将行尾字符 \r\n 附加到消息中

    【讨论】:

    • 我删除了 ser.inWaiting() 循环并写了out = ser.read(10),但我仍然只收到第一个字节。
    • 我会专注于您正在传输的内容。可能是您没有发送您认为的内容。首先,作为测试,我将删除\r\n。其次,我会尝试使用 struct 准确发送您打算发送的字节。作为 ser.write 的一部分,您向设备发送了多少字节(不包括换行格式)?
    • 我删除了\r\n,它成功了!你知道为什么会这样吗?
    • \r\n 将在您传输的消息中附加两个字节。我的猜测是,这使接收您的消息的设备感到困惑。我很高兴它成功了。
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2022-01-15
    • 2011-06-24
    相关资源
    最近更新 更多