繁体   English   中英

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

[英]Python: serial.readline() - how to define the EOL from \n to \n\n

非常抱歉一天之后在这里提出另一个问题。

详细的新问题是:我将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 ='\\ n \\ n'),但对于Python 3.x则不起作用。

似乎有第二种选择,编写我自己的readline函数。

但是我绝对是python的初学者。 所以我不知道我应该从哪里开始。

可能还有其他一些选择。

最好的问候,A.

调整pySerial 2.6的答案:在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实例,并使用适当的参数构建-例如,如果未提供所需的eol标记,则默认timeoutNone可能导致该实例无限期地阻塞。 如果我正确阅读了问题,这对于OP来说似乎不是问题,但是在一般情况下这要注意的。

您应该将超时设置为0.12 (或将其设置为“实时”的任何值),并使用readall() 然后,您有多种选择:

  1. 如果您希望\\n\\n\\n都作为分隔符,请对readall()的数据调用replace("\\n\\n", "\\n") readall()并自己通过调用split("\\n") readall()将其分成几行split("\\n")
  2. 如果只希望\\n\\n用作分隔符,则只需对readall()的数据调用split("\\n\\n") readall()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM