我已经编写了一些代码来使用相同的 HC-12 433Mhz 收发器在两个 Raspberry Pi 之间进行通信。我能够使用直接串行连接和echo/成功地在两个 Pi 之间进行回声cat,但是我无法使用 HC-12s 进行复制,理论上它的工作原理类似。我在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()))
Run Code Online (Sandbox Code Playgroud)
这是发送程序:
while True:
print("Sending...")
ser.write("hello\n".encode())
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
和接收程序:
while True:
print("Receiving...")
data = ser.readlines()
print(data.decode())
Run Code Online (Sandbox Code Playgroud)
发送程序只是按预期循环,但接收器打印“正在接收...”,然后什么也没有。
当我键盘在那时中断接收程序时,它说它当前已达到data = ser.readlines().
任何帮助将不胜感激 - 上周我大部分时间都在拖网和筋疲力尽的论坛和自述文件中无济于事,这实际上是我的最后选择。在这一点上我接近疯狂!
pyserialreadlines()函数依赖超时参数来了解何时到达文件末尾 - doco 中对此进行了警告。因此,如果没有超时,结束永远不会发生,因此它会永远缓冲所有读取的行。
因此,您只需为打开的串行端口添加一个超时,然后您现有的代码就会开始工作。
ser = serial.Serial(
port = "/dev/ttyAMA0",
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout = 2 # seconds # <-- HERE
)
Run Code Online (Sandbox Code Playgroud)
readline()更好的方法可能是对每一行依次使用(注意单数,没有“s”):
print( "Receiving..." )
while True:
try:
data = ser.readline()
print( data.decode() )
# TODO - something with data
except:
print( "Error reading from port" )
break
Run Code Online (Sandbox Code Playgroud)
因为这将允许代码逐行作用于输入。