Arduino Serial.println 正在打印两行

Arduino Serial.println is printing two lines

我正在做一些简单的 arduino 项目以学习一些基础知识。

对于这个项目,我正在尝试打印通过串行监视器发送的一行。当我打印该行时,我的前导文本与用户输入的第一个字符一起打印,然后新行开始并且前导文本与其余用户数据一起再次打印。我不确定为什么会这样。

这是我的代码:

char data[30];

void setup() 
{  
 Serial.begin(9600);
}

void loop() 
{
 if (Serial.available())
 {  
  //reset the data array
  for( int i = 0; i < sizeof(data);  ++i )
  {
   data[i] = (char)0;
  }

  int count = 0;
  
  //collect the message
  while (Serial.available())
  {
    char character = Serial.read();
    data[count] = character;
    count++;
  }

  //Report the received message
  Serial.print("Command received: ");
  Serial.println(data);
  delay(1000);
 }
}

当我将代码上传到我的 Arduino Uno 并打开串口监视器时,我可以输入如下字符串:"Test Message"

当我按下回车键时,我得到以下结果:

收到命令:T

收到命令:est 消息

当我期待的是:

收到命令:测试消息

有人能指出我正确的方向吗?

在此先感谢您的帮助。

Serial.available() 不是 return 布尔值,它 return 是 Arduino 的串行缓冲区中有多少字节。因为您将该缓冲区移动到 30 个字符的列表中,所以您应该检查串行缓冲区是否为 30 个字符长,条件为 Serial.available() > 30.

这可能导致代码在串行缓冲区有任何数据时立即执行一次,因此第一个字母 运行 然后再次意识到更多已写入缓冲区。

我还建议完全删除您的 data 缓冲区并使用直接来自串行缓冲区的数据。例如

Serial.print("Command received: ");
while (Serial.available()) {
    Serial.print((char)Serial.read());
}

编辑:如何等待串行数据发送完毕

if (Serial.available() > 0) {                 // Serial has started sending
    int lastsize = Serial.available();        // Make a note of the size
    do {  
        lastsize = Serial.available();        // Make a note again so we know if it has changed
        delay(100);                           // Give the sender chance to send more
    } while (Serial.available() != lastsize)  // Has more been received?
}
// Serial has stopped sending