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

使用Python串行库处理从串行端口读取的原始数据?,python,serial-port,readline,pyserial,raw-data,Python,Serial Port,Readline,Pyserial,Raw Data,我不是Python程序员,而是电子电路设计师,但这次我必须处理微控制器通过RS232端口发送到Python脚本(PHP脚本称为)的一些原始数据 我花了好几个小时试图确定使用Python从串行(RS232)端口读取原始字节的最佳方法,我确实得到了结果——但我希望有人能澄清我在研究过程中注意到的某些不一致之处,如下所示: 1: 我可以看到很多提出类似问题的人被问到他们是否正在使用serial或pySerial模块,以及他们是如何安装串行库的。我只能说,我真的不知道我使用的是哪个模块,因为这个模块是现

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

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

1:
我可以看到很多提出类似问题的人被问到他们是否正在使用
serial
pySerial
模块,以及他们是如何安装串行库的。我只能说,我真的不知道我使用的是哪个模块,因为这个模块是现成的。我在某个地方读到的
serial
pySerial
是一样的,但我找不到这是不是真的。我所知道的就是我正在使用Python2.7.9和Raspbian操作系统

2:
我读过从串行端口读取的方法有
read()
readline()
两种,但是在中没有提到
readline()
方法。此外,我发现'number of bytes to read'参数可以传递给
readline()
方法以及
read()
方法(其工作方式相同,限制了要读取的字节数),但我找不到要记录的参数

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

read\u byte=ser.read()
读取字节不是无时:
read_byte=ser.read()
打印“%x”%ord(读取字节)
但结果是:

回溯(最近一次呼叫最后一次):
文件“/testread.py”,第53行,在
通读
文件“/testread.py”,第32行,全部读取
打印“%x”%ord(读取字节)
TypeError:ord()应为字符,但找到长度为0的字符串
从缓冲区读取最后一个字节后,我只能用以下代码检测空缓冲区:

为True时:
c=rs232.read()
如果len(c)==0:
打破
打印整数(c.encode(“十六进制”)、16、“”、,
因此,我不确定不适用于我的代码是否适用于其他串行库。我的openinig端口代码是BTW:

rs232=串行。串行(
端口='/dev/ttyUSB0',
波特率=2400,
奇偶校验=串行。奇偶校验\u无,
停止位=串行。停止位\u一,
bytesize=serial.EIGHTBITS,
超时=1
)
4:
我从µC接收的数据格式如下:

0x16 0x02 0x0b 0xc9。。。0x0d 0x0a

这是
一些原始字节+\r\n
。由于“原始字节”可以包含
0x00
,有人能确认将字节读入Python字符串变量没有问题吗?据我所知,这应该可以很好地工作,但不是100%确定。

PySerial适合我,尽管我还没有在Pi上使用过它

3:Read()返回一个字符串-如果没有读取数据,则长度为零,因此您的更高版本是正确的。由于字符串不是字符,因此应使用ord(读取字节[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)

will print length 1是否为“是,字符串中只能有0个字节”,意思是“是,字符串中不能有0个字节”?我想知道的是,例如从RS232接收并分配给字符串变量的
0x00、0x00、0x00、0x00、0x0d、0x0a是否会导致问题。据我所知,内部字符串表示法是以null结尾的C字符串,但我找不到零是否可以存储在内部表示法的高级表示法中。在Linux/Windows上使用的常用Python中,字符串的内部表示法不是以nul结尾的。你可以在字符串中放入任何值字符。这意味着这样一句话:“在内部,最流行的Python实现是用C编写的,所以可能在引擎盖下的某个地方有一个以NULL结尾的字符串。”这是错误的吗?顺便说一句,我不能再编辑(在发布后的前5分钟内)或删除我自己的评论,因为没有x图标(或任何东西)鼠标悬停。函数before工作正常,但不再工作。问题完全如所述。遗憾的是,我没有足够的信誉点来留下评论以确认问题。注意:我没有太多信誉点,但我知道编辑/删除自己的评论功能以前是如何工作的。这个答案只适用于字符串实现对于编写python的开发人员来说是不透明的,而且对于使用nul终止的实现肯定是错误的,正如Josiah Yoder所评论的那样。