使用Python串行库处理从串口读取的原始数据?

时间:2016-10-22 06:04:29

标签: python serial-port readline pyserial raw-data

我不是Python程序员,而是电子电路设计师,但这次我必须处理微控制器通过RS232端口向Python脚本发送的原始数据(由PHP脚本调用)。

我花了几个小时试图确定使用Python从串行(RS232)端口读取原始字节的最佳方法,我确实得到了结果 - 但我想如果有人能澄清我在研究期间注意到的某些不一致他们在这里:

1
我可以看到很多提出类似问题的人被问到他们是使用serial还是pySerial模块,他们是如何安装串行库的。我只能说我真的不知道我正在使用哪个模块,因为该模块是开箱即用的。在某处,我读到serialpySerial是一回事,但我无法找到是否属实。我所知道的是我正在使用带有Raspbian OS的Python 2.7.9。

2
我已经读过有read()readline()方法可以从串口读取,但在pySerial API docs中没有提到readline()方法。此外,我发现“要读取的字节数”参数可以传递给readline()方法以及read()方法(并且以相同的方式工作,限制要读取的字节数)但我找不到要记录的内容。

第3:
在搜索如何确定是否已读取RS232缓冲区中的所有数据时,我here找到了以下代码:

read_byte = ser.read()
while read_byte is not None:
    read_byte = ser.read()
    print '%x' % ord(read_byte)

但结果是:

Traceback (most recent call last):
  File "./testread.py", line 53, in <module>
    read_all()
  File "./testread.py", line 32, in read_all
    print '%x' % ord(read_byte)
TypeError: ord() expected a character, but string of length 0 found

从缓冲区读取最后一个字节后,我只能使用以下代码检测空缓冲区:

while True:
    c = rs232.read()
    if len(c) == 0:
        break
    print int(c.encode("hex"), 16), " ",

所以我不确定那些对我不起作用的代码是否适用于某些不同于我的串行库。我的openinig端口代码是BTW:

rs232 = serial.Serial(
    port = '/dev/ttyUSB0',
    baudrate = 2400,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS,
    timeout = 1
)

4
我从μC收到的数据格式为:

0x16 0x02 0x0b 0xc9 ... 0x0d 0x0a

那是some raw bytes + \r\n。由于'raw bytes'可以包含0x00,有人可以确认这不是将字节读入Python字符串变量的问题吗?据我所知,应该运作良好但不是100%肯定。

1 个答案:

答案 0 :(得分:1)

PySerial为我工作,虽然没有在Pi上使用它。

3:Read()返回一个字符串 - 如果没有读取数据,这将是零长度,因此您的更高版本是正确的。由于字符串不是字符,您应该使用例如ord(read_byte [0])打印对应于第一个字符的数字(如果字符串的长度> 0) 你的职能:

while True:
    c = rs232.read()
    if len(c) == 0:
        break
    print int(c.encode("hex"), 16), " ",

需要添加一些内容来累积读取的数据,否则会被丢弃

rcvd = ""
while True:
    c = rs232.read()
    if len(c) == 0:
        break
    rcvd += c
    for ch in c:
        print ord(ch), " ",

4: 是的,您可以在字符串中接收并输入nul(0x00)个字节。例如:

a="\x00"
print len(a)

将打印长度为1