发送“(char)0”时,Python pySerial从arduino读取的数据中断

2024-10-03 09:11:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我用pySerial从arduino发送一些数据。在

我的数据看起来像

bytearray(DST, SRC, STATUS, TYPE, CHANNEL, DATA..., SIZEOFDATA) 

其中sizeofData是一个所有字节都被接收的测试。在

问题是,每当一个字节为零时,我的python程序就会停止读取:

^{pr2}$

例如,当我发送bytearray(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)时,一切正常。但是当我发送类似bytearray(1,2,3,4,0,1,2,3,4)的内容时,我并没有看到所有内容都以零开头。在

问题是我不能避免发送零,因为我只是发送“内存转储”,例如,当我发送一个浮点值时,可能有零字节。在

如何告诉pyserial不要忽略零字节。在


Tags: 数据程序src内容data字节typestatus
1条回答
网友
1楼 · 发布于 2024-10-03 09:11:07

我已经看过PySerial的源代码,问题出在PySerial的FileLike.readline(in http://svn.code.sf.net/p/pyserial/code/trunk/pyserial/serial/serialutil.py)的实现中。冒犯的功能是:

def readline(self, size=None, eol=LF):
    """\
    Read a line which is terminated with end-of-line (eol) character
    ('\n' by default) or until timeout.
    """
    leneol = len(eol)
    line = bytearray()
    while True:
        c = self.read(1)
        if c:
            line += c
            if line[-leneol:] == eol:
                break
            if size is not None and len(line) >= size:
                break
        else:
            break
    return bytes(line)

明显的问题是if c:行。当c == b'\x00'时,它的计算结果为false,并且例程将脱离读取循环。最简单的方法是自己重新实现,比如:

^{pr2}$

为了澄清您的注释,这是对Serial.readline方法的替代,该方法将使用空字节并将它们添加到返回的字符串中,直到它碰到eol字符,我们在这里将其定义为"\n"。在

使用新方法的一个示例是,使用file对象替换套接字:

>>> # Create some example data terminated by a newline containing nulls.
>>> handle = open("test.dat", "wb")
>>> handle.write(b"hell\x00o, w\x00rld\n")
>>> handle.close()
>>>
>>> # Use our readline method to read it back in.
>>> handle = open("test.dat", "rb") 
>>> readline(handle)
'hell\x00o, w\x00rld\n'

希望这有点道理。在

相关问题 更多 >