pySerial - 只读取一个字节

时间:2017-06-19 20:49:52

标签: python serial-port pyserial

我正在尝试使用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上的代码)

1 个答案:

答案 0 :(得分:0)

您的read语句明确请求1个字节:

ser.read(1)

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

ser.read(10)

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

还可以设置超时以防止程序挂起。只需在Serial构造函数中添加一个timeout参数即可。以下内容将为您提供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附加到邮件中