3

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

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

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

2:
我已经阅读了从串口读取的方法,但是在read()pySerial API 文档中没有提到该方法。此外,我发现“要读取的字节数”参数可以传递给方法和方法(并且工作方式相同,限制要读取的字节数)但我找不到要记录的。readline()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。由于“原始字节”可以包含0x00,有人可以确认将字节读入 Python 字符串变量不是问题吗?据我了解,这应该可以正常工作,但不是 100% 确定。

4

1 回答 1

3

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

于 2016-10-22T10:01:40.567 回答