查看: 1789|回复: 0

[分享]关于arduino串口的理解,基础入门(原创)

[复制链接]

该用户从未签到

发表于 2018-1-13 12:06 | 显示全部楼层 |阅读模式
对串口监视器做了些总结如下:
/*
  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后才被还原为空。
*/



您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

热门推荐

KittenBot杯第六届开源硬件开发大赛启动啦
KittenBot杯第六届开源硬
大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
关于arduino编译问题
关于arduino编译问题
编译示例程序老是这个问题,换了电脑都不行
莫名乱码 —— Arduino+RFID-RC522 读写实验
莫名乱码 —— Arduino+RF
目标:想把自己房间门改成感应门锁 器材:Arduino Uno (淘宝七星虫LY-F2)、RFID-RC
[blinker开发实战2]数据反馈
[blinker开发实战2]数据反
[md] ### 添加DIY组件 在编辑模式下,点击按键进入编辑组件页面,可以看到 **按键
用Arduino控制PS2无线手柄为什么一直连接不上
用Arduino控制PS2无线手柄
用Arduino UNO板 连接PS2手柄接收器,为什么指示灯已经显示对接上了,但是打开串口监
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
快速回复 返回顶部 返回列表