无法在Python中通过HC-12 / UART发送/接收数据

时间:2020-07-02 13:34:12

标签: python pyserial

我已经编写了一些代码,以使用相同的HC-12 433Mhz收发器在两个Raspberry Pi之间进行通信。我能够使用直接串行连接和echo / cat在两个Pi之间成功地回显,但是我无法使用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())

发送程序只是按预期的方式循环,但是接收方会打印“正在接收...”,然后什么也不会打印。

当我在此时用键盘中断接收程序时,它表示当前已达到data = ser.readlines()

任何帮助将不胜感激-上周我花了大部分时间来拖网,用尽论坛和自述文件,但无济于事,这实际上是我的最后选择。快要疯了!

2 个答案:

答案 0 :(得分:3)

pyserial readlines()函数依靠timeout参数来知道何时到达文件结尾-警告in the 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

这样可以使代码逐行作用于输入。

答案 1 :(得分:1)

使用Serial.read_until方法。默认终止符为\n

例如,

data = ser.read_until()
print(data)