Arduino Serial.println正在打印两行

时间:2015-04-12 19:45:01

标签: arduino println

我正在做一些简单的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);
	}
}
&#13;
&#13;
&#13;

当我将代码上传到我的Arduino Uno并打开串口监视器时,我可以输入一个字符串,如:&#34;测试消息&#34;

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

收到命令:T

收到命令:est消息

当我期待的是:

收到的命令:测试消息

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

一旦串行缓冲区有任何数据,这可能导致代码执行一次,因此它运行第一个字母然后再次实现更多已写入缓冲区。

我建议您完全删除data缓冲区并直接使用串行缓冲区中的数据。 e.g

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