[分享]关于arduino串口的理解,基础入门(原创)
对串口监视器做了些总结如下:/*
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.printnl(Serial.read());
delay(1000);
}
打开串口监视可以看到一连串的-1,显示的是一种链接状态,这时串口缓存区没有数据。Serial.available()返回的数值为0
*/
/*
关于Serial.available()的解释,这命令用于获取串口缓存区字符的长度,如下代码:
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.println(Serial.available());
delay(1000);
}
打开串口监视器,当无任何输入的时候一直显示0,当输入1234时,显示4表示我们输入了4个字符。再输入abcd时显示8,表示缓存区一共有8个字符,如果继续输入会不断累计。
当关闭监视器在重新打开的时候,显示为0。说明关闭监视器缓存区里面数据会被清空。
*/
/*
做个实验:当在监视器中输入字母A时,13号引脚上led灯亮5秒。
void setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);
}
void loop() {
digitalWrite(13,LOW);
while(Serial.available()){ //当缓存区有数据才执行该操作
char val = Serial.read();
Serial.println(val);
if(val == 'A'){
digitalWrite(13,HIGH);
delay(5000);
}
}
}
以上代码虽然达到了预期效果,同时也发现了一个问题,如果我想在串口中输入AB时led灯才亮,我将if(val == 'AB')并不能实现效果。
原因:在串口监视器中输入AB时,实际是先写入A,然后再写入B。而val = Serial.read(); 实际是进行了两个步骤,将A存入val 再将B存入val,最后val值为B而不是AB。
以点击发送键为一次完整的操作过程。
*/
//如何实现输入AB时灯亮5秒呢?
String data = ""; //定义一个String对象用于储存缓存区输入的数据,注意用的是""号,注意要声明在函数外部。
void setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);
}
void loop() {
digitalWrite(13,LOW);
while(Serial.available()){ //当缓存区有数据才执行该操作
char val = Serial.read();
Serial.println(val);
data += val;
delay(5); //延时是为了让data有充分时间做+=操作
Serial.println(data);
if(data == "AB"){
digitalWrite(13,HIGH);
delay(5000);
}
Serial.println(data);
//data = ""; //位置1
}
data = ""; //位置2
}
/*
发现一个有趣问题,当没有data = "";时,在监视器中输入AB(没有结束符),
显示为
A //val输入的第1个字符
A //存入data的第1个字符
B //val输入第2个字符
AB //在data存在A的基础上用+=拼接B = AB 这时得到了data == "AB"
--灯亮5秒--
输入AB
Serial.read val data
A = A += A
B = B += AB
如果不关闭监视器,再次输入AB时 data 会累计变成ABAB != AB,不会再亮
要加上 data = ""; 还原设置,但如果加在上式-位置1处,输入AB灯并不会亮,因为结果为
A //val输入的第1个字符
A //存入data并打印后,就被data = ""还原为空值了
B //val输入第2个字符
B //因为data上面被还原为空,所以这里只存入B,后同样被还原为空
data = "" 加在位置2时则可以达到想要的效果,即data得到AB后才被还原为空。
*/
页:
[1]