![](/img/trans.png)
[英]how to read data from python serial.readline() data into string
[英]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
标记,则默认timeout
为None
可能导致该实例无限期地阻塞。 如果我正确阅读了问题,这对于OP来说似乎不是问题,但是在一般情况下这是要注意的。
您应该将超时设置为0.12
(或将其设置为“实时”的任何值),并使用readall()
。 然后,您有多种选择:
\\n
和\\n\\n
都作为分隔符,请对readall()
的数据调用replace("\\n\\n", "\\n")
readall()
并自己通过调用split("\\n")
readall()
将其分成几行split("\\n")
。 \\n\\n
用作分隔符,则只需对readall()
的数据调用split("\\n\\n")
readall()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.