我真的很抱歉在一天之内再问一个问题。
详细的新问题: 我将HOKUYO的激光测距仪连接到我的RaspBerryPi上。
由于serial.py
,连接等可以找到我唯一的问题是,我发送一个命令,我得到一个回音和一个时间戳+ \ n回来。
缓冲区中的数据如下所示:
MD000007200001\n
2Dh1\n
\n\n
此后,传感器发送测量值,其锁定方式如
MD000007200001\n
2Dh1\n
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n
.....
...
0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n
\n\n
读取这些数据,目前我使用readall()。还试过readlines()。在这两种情况下我都遇到了问题,必须等到超时时间设置为1。 这对于实时应用需要太多时间,并且该传感器可以每120ms测量一次。如果我将超时设置为0,我经常会错过一些数据并且所有内容都会崩溃,因为我需要整个数据集来进行计算。
我还读到,有一个选项可以将readline的EOL设置为readline(eof =&#39; \ n \ n&#39;)但是使用Python 3.x这不会起作用。< / p>
似乎有第二个选项,编写我自己的readline函数。
但我在python中是一个绝对的初学者。所以我不知道应该从哪里开始。
可以有一些额外的选择。
最好的问候,A。
答案 0 :(得分:2)
在pySerial 2.6: specify end-of-line in readline()调整答案(也提供替代方案),可以编写如下函数:
def readline(a_serial, eol=b'\n\n'):
leneol = len(eol)
line = bytearray()
while True:
c = a_serial.read(1)
if c:
line += c
if line[-leneol:] == eol:
break
else:
break
return bytes(line)
当然, a_serial
必须是使用适当参数构建的serial.Serial
实例 - 例如,timeout
的默认None
可能会导致此操作无限期阻止所需的eol
标记不会出现。如果我正确地阅读了问题,这似乎不是OP的问题,但是, 在一般情况下需要注意的事情。
答案 1 :(得分:0)
您应该将超时设置为0.12
(或者您要做的任何事情&#34;实时&#34;)并使用readall()
。然后,您有许多选择:
\n
和\n\n
都计为分隔符,请在replace("\n\n", "\n")
的数据上调用readall()
,然后通过调用{{}将其划分为多行。 1}}。split("\n")
计为分隔符,只需对来自\n\n
的数据发送split("\n\n")
。