【问题标题】:Python: serial.readline() - how to define the EOL from \n to \n\nPython:serial.readline() - 如何定义从 \n 到 \n\n 的 EOL
【发布时间】:2014-12-23 18:24:59
【问题描述】:

我真的很抱歉在一天之内在这里问了另一个问题。

新问题详解: 我将 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 的超时。 对于实时应用程序来说,这需要太多时间,而且该传感器可以每 120 毫秒测量一次。如果我将超时设置为 0,我经常会错过一些数据并且一切都崩溃了,因为我需要整个数据集来进行计算。

我还读到,有一个选项可以设置 readline 的 EOL,例如 readline(eof='\n\n') 但对于 Python 3.x,这将不起作用。

似乎有第二个选项,编写我自己的 readline-function。

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

可能还有一些额外的选择。

最好的问候,A。

【问题讨论】:

  • shd 很容易适应stackoverflow.com/questions/16470903/… 的答案——那些正在寻找\r 的EOL,你正在寻找\n\n,但除此之外它似乎是同样的问题。您需要更完整地说明吗?
  • 那会很酷,是的。我已经阅读了那个答案,但无法实现我自己的 readline() 函数;

标签: python serial-port readline eol


【解决方案1】:

调整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 实例,当然 - 例如,如果所需的 eol 标记未出现,None 的默认 timeout 可能会导致此无限期阻塞.如果我正确阅读了问题,这对 OP 来说似乎不是问题,但是 在一般情况下需要注意。

【讨论】:

  • 谢谢,就是这样。似乎我误解了 pySerial 2.6 的答案:在 readline() 中指定行尾;我以为我必须从 pyserial 库中更改现有的函数 readline。
【解决方案2】:

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

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

【讨论】:

  • 感谢该信息,但关键是,我不想要任何时间依赖性;最好的方法是,当有可能使用 readline 从缓冲区读取直到 \n\n.
  • 然后将timeout 设置为0。请参阅文档:pyserial.sourceforge.net/…
猜你喜欢
  • 2019-12-15
  • 2020-05-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多