Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Raspberry Pi和Arduino之间的串行通信不稳定_Arduino_Raspberry Pi_Serial Port_Communication - Fatal编程技术网

Raspberry Pi和Arduino之间的串行通信不稳定

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”,这样

我正在制作一个系统,其中我有一个Pi,它将通过UDP发送字符串到一个有Wifi的Arduino。然后,Arduino将向Pi发送一些数据。这部分工作完美无瑕。然后Pi将通过串行方式将相同的数据中继到没有Wifi的Arduino Mega。这是我的问题。我能够通过UDP接收所有数据,但当我尝试接收数据,然后通过串行发送时,它会出现故障,什么都不起作用。它只接收空值。我知道这一点,因为在Arduino Mega上,我设置了一个系统,它只需接收接收到的数据,然后将其发送回,并在上面签名“ACK”,这样我就知道它已成功接收。我得到的只是空的东西。但是当我通过串口发送字符串“HI”并禁用UDP时,它神奇地工作了。。。有时候。出了什么问题

Pi上的代码

#!/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协议的经验中,一个微小的延迟对可靠的通信有着巨大的影响

底线是:你有时间问题