Raspberry Pi和Arduino之间的串行通信不稳定
我正在制作一个系统,其中我有一个Pi,它将通过UDP发送字符串到一个有Wifi的Arduino。然后,Arduino将向Pi发送一些数据。这部分工作完美无瑕。然后Pi将通过串行方式将相同的数据中继到没有Wifi的Arduino Mega。这是我的问题。我能够通过UDP接收所有数据,但当我尝试接收数据,然后通过串行发送时,它会出现故障,什么都不起作用。它只接收空值。我知道这一点,因为在Arduino Mega上,我设置了一个系统,它只需接收接收到的数据,然后将其发送回,并在上面签名“ACK”,这样我就知道它已成功接收。我得到的只是空的东西。但是当我通过串口发送字符串“HI”并禁用UDP时,它神奇地工作了。。。有时候。出了什么问题 Pi上的代码Raspberry Pi和Arduino之间的串行通信不稳定,arduino,raspberry-pi,serial-port,communication,Arduino,Raspberry Pi,Serial Port,Communication,我正在制作一个系统,其中我有一个Pi,它将通过UDP发送字符串到一个有Wifi的Arduino。然后,Arduino将向Pi发送一些数据。这部分工作完美无瑕。然后Pi将通过串行方式将相同的数据中继到没有Wifi的Arduino Mega。这是我的问题。我能够通过UDP接收所有数据,但当我尝试接收数据,然后通过串行发送时,它会出现故障,什么都不起作用。它只接收空值。我知道这一点,因为在Arduino Mega上,我设置了一个系统,它只需接收接收到的数据,然后将其发送回,并在上面签名“ACK”,这样
#!/usr/bin/env python3
import serial
import time
import socket
serialData = 'null \n'
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
message = b'pi'
addr = ("192.168.71.146", 2390)
def wifirecv():
global serialData
s.sendto(message, addr)
data, address = s.recvfrom(10240)
#print(data.decode())
angle = data.decode()
serialData = angle + ' \n'
while(True):
ser = serial.Serial('/dev/ttyACM0', 115200, timeout=1)
ser.flush()
ser.close()
ser.open()
while True:
try:
wifirecv()
print(serialData)
ser.write(serialData.encode('utf-8'))
#ser.write(b'hi')
line = ser.readline().decode('utf-8').rstrip()
print(line)
except(KeyboardInterrupt):
ser.close()
print("Serial Closed")
exit()
巨型计算机上的代码
void setup() {
Serial.begin(115200);
}
void loop() {
while(Serial.available() != 0){
String data = Serial.readStringUntil('\n');
Serial.println(data + ": ACK");
}
}
尽管您提到Arduino的响应工作正常,但我认为您应该使用
SerialEvent
中断回调,而不是轮询.available
方法。当数据出现在输入缓冲区中时,这是一种更可靠的检测方法。我会像在官方文件中那样,一个字符一个字符地形成输入字符串
我认为您选择的方法可能会导致串行端口出现计时问题,因为您说过:
我能够通过UDP接收所有数据,但当我尝试接收数据,然后通过串行方式发送数据时,它会出现故障,什么都不起作用
这些故障也可能是所选波特率或(再次)轮询方法的结果。你的声明进一步证实了这一点:
串行端口和禁用UDP的东西,它神奇地工作。。。有时
您是否尝试过使用read\u直到(LF,None)
而不是readline()
?在一些采集程序中,第一次采集的结果更好。查证
您是否使用Pi或Arduino的其他资源?我不确定UDP是否与来自RPi的串行通信有误。我非常怀疑,但只要检查一下套接字库是否存在报告的问题就可以了
最后,RPi中write()
和read()
之间的睡眠时间(ms)
,可能不会对通信造成太大影响。例如,在我最近使用I2C协议的经验中,一个微小的延迟对可靠的通信有着巨大的影响
底线是:你有时间问题