Python pySerial:读取的数据不能超过8个字符
我使用pyserial通过UART在两个覆盆子pi之间进行写和读 Raspberry pi 1:将数据发送到Raspberry pi 2Python 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
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