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

2024-05-10 13:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我花了好几个小时试图确定使用Python从串行(RS232)端口读取原始字节的最佳方法,我确实得到了结果——但我想请某人澄清我在研究过程中注意到的某些不一致之处,它们如下:

1:
我可以看到很多问类似问题的人被问到他们是在使用serial模块还是pySerial模块,以及他们是如何安装串行库的。我只能说我不知道我用的是哪个模块,因为这个模块是现成的。在我读过的某个地方serialpySerial是同一件事,但我找不到是否是真的。我所知道的只是我正在使用带有Raspbian操作系统的Python 2.7.9。

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

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

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字符串变量时这不是问题吗?据我所知,这应该很有效,但不是百分之百确定。


Tags: 模块方法端口代码脚本readreadline字节
1条回答
网友
1楼 · 发布于 2024-05-10 13:53:31

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), " ",

四: 是的,您可以接收并将nul(0x00)字节放入字符串中。例如:

a="\x00"
print len(a)

将打印长度1

相关问题 更多 >