
你可能会遇到一个状况,即多次发送命令才有反应,这是因为程序在不断循环运行,所以每次循环都会执行代码。如果你恰好在运行Serial.Read()之前发送了数据,那么就可以进行判断。因此,要先判断是否有数据传输过来,再进行后续操作。
值得注意的是,使用Serial.Read()后,所有已接收的数据会被清空。例如,假设你的程序中加入了判断有数据的语句,然后你输入了'g',第一个if判断会进行:Serial.Read()此时是g,不等于k,跳过。但是,此时缓存中的g已经被清除了,因此,第二个if判断进行:Serial.Read()的值是空,不等于g,也跳过。因此会失效。
解决办法是使用一个变量来保存结果。例如,可以创建一个char变量temp来保存从Serial.read()获取的数据。这样,即使Serial.Read()清空了缓存,temp仍能保存上一次读取的数据。
示例程序如下:
void setup()
{
pinMode(13,OUTPUT); //使13口成为输出口
Serial.begin(9600);
}
void loop()
{
while(Serial.available()<=0); //这里是一个死循环,如果没有数据就一直什么都不干,如果有数据,就跳出循环(下面就是判断)
char temp=char(Serial.read()); //保存数据(char(),转换为字符)
if(temp=='k'){
digitalWrite(13,HIGH);
}
else if(temp=='g'){
digitalWrite(13,LOW);
}
}
需要注意的是,Serial.available()命令用于判断串口是否有数据,有就返回可以读取的字节的数目,没有就是0,通常用if(Serial.available()>0)进行判断。
总结来说,为了确保数据不会被清空,可以使用一个变量来保存从Serial.read()获取的数据,从而避免数据丢失。
官网解释:Get the number of bytes (characters) available for reading from the serial port. This is data that's already arrived and stored in the serial receive buffer (which holds 64 bytes). available() inherits from the Stream utility class.
通过这种方式,你可以确保每次读取的数据不会被清空,并且能够正确地进行判断和操作。