Python pySerial:读取的数据不能超过8个字符

Python pySerial:读取的数据不能超过8个字符,python,raspberry-pi,pyserial,serial-communication,Python,Raspberry Pi,Pyserial,Serial Communication,我使用pyserial通过UART在两个覆盆子pi之间进行写和读 Raspberry pi 1:将数据发送到Raspberry pi 2 while 1: ser=serial.Serial('/dev/ttyAMA0') if not ser.isOpen(): ser.open() msg=raw_input('RPi 1 send:') ser.write(msg) ser.cl

我使用pyserial通过UART在两个覆盆子pi之间进行写和读

Raspberry pi 1:将数据发送到Raspberry pi 2

    while 1:
        ser=serial.Serial('/dev/ttyAMA0')
        if not ser.isOpen():
            ser.open()
        msg=raw_input('RPi 1 send:')
        ser.write(msg)
        ser.close()
Raspberry pi 2:从Raspberry pi 1接收数据

    while 1:
        ser=serial.Serial('/dev/ttyAMA0' ,timeout=0)
        if not ser.isOpen():
            ser.open()
        data=ser.read(1024)
        if data.__len__()>0:
            print 'RPi 2 receive:',data
        ser.close()
我运行这两个代码

并发送数据

    RPi 1 send : Hello
并接收数据

    RPi 2 receive : Hello
但是如果RPi 1发送的数据超过8个字符

比如说

    RPi 1 send : Hello Raspberry pi NO.2
结果是

    RPi 2 receive: Hello Ra
    RPi 2 receive: spberry 
    RPi 2 receive: pi NO.2
这是我的问题。因为我希望它能像这样接收

RPi 2接收:Hello Raspberry pi NO.2仅显示一行

如果再次发送更多的8个字符,它将显示在新行中

什么代码将其连接到一行中?或者用其他方法来做这件事

使用ser.read进行阅读时,您只是在阅读已存在于 缓冲区,或等待字符到达缓冲区。指定的大小 是要接收的最大字符数,但可以根据需要减少 经验丰富

您有两个简单的解决方案:

使用ser.readline并在字符串中放入终止符,如\n 如果您事先知道要读多少个字符,请重复阅读 直到你全部收到为止 在这两种情况下,请指定超时时间,例如打开时1秒 串行线,如果远程端 不管什么原因都不发送任何东西

希望能有所帮助。

使用ser.read阅读时,您只是在阅读文档中已有的内容 缓冲区,或等待字符到达缓冲区。指定的大小 是要接收的最大字符数,但可以根据需要减少 经验丰富

您有两个简单的解决方案:

使用ser.readline并在字符串中放入终止符,如\n 如果您事先知道要读多少个字符,请重复阅读 直到你全部收到为止 在这两种情况下,请指定超时时间,例如打开时1秒 串行线,如果远程端 不管什么原因都不发送任何东西

希望有帮助。

我喜欢这样做

sender.py receiver.py 我喜欢这样做

sender.py receiver.py
只读读取的内容与当时已准备好的内容相同。只读读取的内容与当时已准备好的内容相同。现在,我根据您的建议编辑代码,代码显示正确。但是我是python的新手,我不知道为什么要添加delim?为什么delim必须是\x00?这条线是怎么工作的?Joineterlambda:ser.read1,delim?你能给我描述一下这个代码吗?所以非常感谢你的回答:那行只是说继续读,直到我们得到分隔符。。。您可以使用任何您想要的分隔符。。。但是\0几乎永远不会出现在实际的消息内容中,因此使用它是一个很好的方法。现在,我可以根据您的建议编辑代码,并正确显示。但是我是python的新手,我不知道为什么要添加delim?为什么delim必须是\x00?这条线是怎么工作的?Joineterlambda:ser.read1,delim?你能给我描述一下这个代码吗?所以非常感谢你的回答:那行只是说继续读,直到我们得到分隔符。。。您可以使用任何您想要的分隔符。。。但是\0几乎永远不会出现在实际的消息内容中,因此它是一个很好的使用方法
delim = "\x00"
ser.write(msg+delim)
delim = "\x00"
recvd = "".join(iter(lambda:ser.read(1),delim))
print recvd