我不是 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% 确定。