Python:serial.readline() - 如何从\ n到\ n \ n定义EOL

时间:2014-12-23 18:25:00

标签: python serial-port readline eol

我真的很抱歉在一天之内再问一个问题。

详细的新问题: 我将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。

2 个答案:

答案 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()。然后,您有许多选择:

  1. 如果您希望将\n\n\n都计为分隔符,请在replace("\n\n", "\n")的数据上调用readall(),然后通过调用{{}将其划分为多行。 1}}。
  2. 如果您只想将split("\n")计为分隔符,只需对来自\n\n的数据发送split("\n\n")