Arduino 没有读取适当数量的字节

Arduino doesn't read a proper amount of bytes

我有一个 Raspberry Pi 通过 USB 连接到 Arduino Mega,并试图从 RPI 向 Arduino 发送一个 8 字节的包。我正在使用 WiringPi 串行库来完成此操作。 RPI 部分扫描串行缓冲区以获取可用数据。如果不是,它将数据写入串行。

for(;;) {
    if (int i = serialDataAvail(f_)) {
       printf("RPI received %d bytes\n", i);
       uint8_t buf[i];
       read(f_, buf, i);
       printf("%s",buf);
    }
    ..some code filling variable widthsChar with data...
    write(f_, widthsChar, sizeof(widthsChar));
    printf("amount sent: %d \n", sizeof(widthsChar));
    usleep(3000000); //3 sec;
}

这是一个 Arduino 部分,它等待 RPI 数据到达并响应接收到的字节数。

while(Serial.available() == 0);
String bytesNum = String(Serial.available());
String newString = "Arduino received " + bytesNum + " bytes\n";
Serial.print(newString);
delay(10000);

我猜,输出应该是这样的:

amount sent: 8
//waits for 3 sec
RPI received 25 bytes
Arduino received 8 bytes
amount sent: 8
//and so far

我在现实中得到的东西不是我能解释的,求人帮助理解。 开始了:

amount sent: 8
//nothings happens for 3 sec
amount sent: 8
RPI received 25 bytes
Arduino received 1 bytes
W??1??0mount sent: 8
// I tried to interpret random chars it displays that way
//and so far

您遇到的问题与事件的实际时间轴有关。

当 RPi 向 Arduino 发送数据时,请记住它是串行发送数据,即一次一个字符。

第一字节数据一到达Arduino,那么Serial.available()就会return1,说明第一个字节已经到了!然后您的代码开始工作以仅处理第一个字节(Arduino 比串行通信快得多)。

一个简单的解决方案是使用 Serial.readBytes(),它将继续读取字节直到 RPi 停止发送,并为您缓冲它们。它将继续读取字节,直到达到串行超时(默认值:1 秒),或直到缓冲区填满。

while(Serial.available() == 0)
    ; // Waiting for data

char buffer[80];
int bytesRead = Serial.readBytes(buffer, 80);

String msg = "Arduino received ";
msg += bytesRead;
msg += " bytes";
Serial.println(msg);
delay(10000);

RPi 在最后一行打印出垃圾字符的问题可能是一个不同的、独立的问题。