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

Python:serial.readline()-如何定义从\n到\n的EOL\n,python,serial-port,readline,eol,Python,Serial Port,Readline,Eol,我真的很抱歉一天之内又问了一个问题 新问题的细节如下: 我把北洋的激光测距仪连接到我的树莓上 由于serial.py,连接等工作可以找到 我唯一的问题是,我正在发送一个命令,我得到一个回音和一个时间戳+\n返回 缓冲区中的数据如下所示: MD000007200001\n 2Dh1\n \n\n 在此之后,传感器传输测量值,该测量值锁定在 MD000007200001\n 2Dh1\n 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C\n

我真的很抱歉一天之内又问了一个问题

新问题的细节如下: 我把北洋的激光测距仪连接到我的树莓上

由于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(eof='\n\n')一样设置readline的EOL,但在Python3.x中,这将不起作用

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

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

可能还有一些额外的选择


致以最诚挚的问候,A.

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

  • 如果希望
    \n
    \n\n
    都作为分隔符计算,请对
    readall()
    中的数据调用
    replace(“\n\n”,“\n”)
    ,并通过调用
    split(“\n”)
    将其拆分为行
  • 如果只希望
    \n\n
    作为分隔符,只需调用
    split(“\n\n”)
    readall()中的数据执行操作即可
  • 根据答案(也提供了备选方案),可以编写如下函数:

    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来说似乎不是一个问题,但是,在一般情况下,这是一个需要注意的问题。

    shd很容易调整答案-,那些人在寻找
    \r
    的下线,你在寻找
    \n\n
    ,但在其他方面似乎是相同的问题。你需要更详细地说明吗?那太酷了,是的。我已经阅读了这个答案,但无法实现我自己的readline()函数;谢谢你提供的信息,但关键是,我不想要任何时间依赖;最好的方法是,当有可能使用readline从缓冲区读取数据直到\n\n。然后将
    超时设置为0。见文档:Thx,就这样。似乎我误解了pySerial 2.6的答案:在readline()中指定行尾;我想我必须从pyserial库中更改现有的函数readline。