首页 > 解决方案 > 无法在 Python 中通过 HC-12/UART 发送/接收数据

问题描述

我编写了一些代码来使用相同的 HC-12 433Mhz 收发器在两个 Raspberry Pi 之间进行通信。我能够使用直接串行连接和echo/在两个 Pi 之间成功回显cat,但是我无法使用 HC-12 复制它,理论上它由类似的主体工作。在此示例中,我在这两个端口ttyAMA0上都使用了该端口,但ttyS0也可用,并且尝试了这些端口的每种组合。

以下代码对发送和接收都是通用的,为简洁起见只写一次:

import serial
import time

ser = serial.Serial(
    port = "/dev/ttyAMA0",
    baudrate = 9600,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS
)
print("Serial status: " + str(ser.isOpen()))

这是发送程序:

while True:
    print("Sending...")
    ser.write("hello\n".encode())
    time.sleep(1)

和接收程序:

while True:
    print("Receiving...")
    data = ser.readlines()
    print(data.decode())

发送程序按预期简单地循环,但接收器打印“Receiving...”,然后什么也没有。

当我在此时键盘中断接收程序时,它说它当前最多为data = ser.readlines().

任何帮助将不胜感激 - 我上周大部分时间都在拖网和疲惫的论坛和自述文件中无济于事,这实际上是我最后的选择。在这个问题上我快疯了!

标签: pythonpyserial

解决方案


pyserialreadlines()函数依赖于 timeout 参数来知道何时到达文件结尾 - 这在 doco 中被警告过。所以没有超时,结局永远不会发生,所以它会一直缓冲所有读取的行。

因此,您只需为打开的串行端口添加一个超时,您现有的代码就会开始工作。

ser = serial.Serial(
    port     = "/dev/ttyAMA0",
    baudrate = 9600,
    parity   = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS,
    timeout  = 2                        # seconds     # <-- HERE
)

更好的方法可能是readline()对每一行依次使用(注意单数,没有's'):

print( "Receiving..." )
while True:
    try:
        data = ser.readline()
        print( data.decode() )
        # TODO - something with data
    except:
        print( "Error reading from port" )
        break

因为这将允许代码逐行作用于输入。


推荐阅读