pySerial:无法读取超过8个字符的数据

时间:2014-01-27 19:43:16

标签: python raspberry-pi pyserial serial-communication

我使用pyserial通过UART在两个Raspberry 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)#show只有一行。

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

在一行中加入什么代码?或其他方式这样做? :)

2 个答案:

答案 0 :(得分:3)

使用ser.read阅读时,您只是阅读已经存在的内容 缓冲区,或等待字符到达缓冲区。您指定的大小 是接收的最大字符数,但它可能比你少得多 经历。

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

  1. 使用ser.readline并在字符串中添加终结符(如\ n)
  2. 如果您事先知道要读取多少个字符,请重复阅读 直到你收到所有
  3. 在这两种情况下,请在打开时指定超时(例如1秒) 串行线,如果远程端,则返回对代码的控制 因任何原因不发送任何内容。

    希望它有所帮助。

答案 1 :(得分:1)

我喜欢这样做

sender.py

delim = "\x00"
ser.write(msg+delim)

reciever.py

delim = "\x00"
recvd = "".join(iter(lambda:ser.read(1),delim))
print recvd