用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

点击进入授权页面

只需一步,快速开始

  • QQ空间
  • 回复
  • 收藏
  • TA的每日心情
    开心
    2018-2-21 19:35
  • 签到天数: 2 天

    [LV.1]初来乍到

    xo37 注册会员 2018-2-13 17:11 楼主
    源码:
    /*
      Serial Event example
      http://www.arduino.cc/en/Tutorial/SerialEvent
    */

    String inputString = "";         // a String to hold incoming data
    boolean stringComplete = false;  // whether the string is complete

    void setup() {
      Serial.begin(9600);
      inputString.reserve(2);
      pinMode(13,OUTPUT);
    }

    void loop() {
      while (Serial.available()) {
        if (Serial.find('light off'))         //这个if里的Serial.find()是100%有效的:light off 与 下面的 light on 对调,谁在这个位置谁100%被检测到
         {
           for (int i = 0; i < 1; i++)
           {
             char inChar = (char)Serial.read();
             inputString += inChar;
             delay(100);
           }
           Serial.println(inputString);
           digitalWrite(13,LOW);
           Serial.println("Light off!");
               Serial.flush();
         }
        else if(Serial.find('light on'))    //这个else if 里的Serial.find(),不一定什么时候生效……
         {
           for (int j = 0; j < 1; j++)
           {
             char inChar = (char)Serial.read();
             inputString += inChar;
             delay(100);         
           }
           Serial.println(inputString);
           digitalWrite(13,HIGH);
           Serial.println("Light on!");
               Serial.flush();
         }
            else
            {
                    Serial.flush();
            }
      }
    }



    串口助手的发收记录:
    [Bash shell] 纯文本查看 复制代码
    17:00:07 You Send : light on
    
    17:00:09 You Send : light on
    
    17:00:09 You Send : light on
    
    17:00:10 You Send : light on
    
    17:00:11 You Send : light on
    
    17:00:13 You Send : light on
    
    17:00:13 You Send : light on
    
    17:00:20 You Send : light off
    ÿ
    
    Light off!
    
    ÿÿ
    
    Light off!
    
    
    17:00:21 You Send : light off
    ÿÿÿ
    
    Light off!
    
    ÿÿÿÿ
    
    Light off!
    
    
    17:00:22 You Send : light off
    ÿÿÿÿÿ
    
    Light off!
    
    ÿÿÿÿÿÿ
    
    Light off!
    
    
    17:00:23 You Send : light off
    ÿÿÿÿÿÿÿ
    
    Light off!
    
    ÿÿÿÿÿÿÿÿ
    
    Light off!
    
    
    17:00:24 You Send : light off
    ÿÿÿÿÿÿÿÿÿ
    
    Light off!
    
    ÿÿÿÿÿÿÿÿÿÿ
    
    Light off!
    
    


    【疑问】:
    1. 不是说Serial.read() 每读取一次,就把缓冲区相应的删除1Byte?为什么会累加?

    2.语句Serial.find() 是有效的,有可能是因为缓冲区没有及时清空,所以才时有时无?

    3.else if 里的Serial.find() 为什么不能100%被触发?是因为缓冲区的影响?
    find() 函式會把接收緩衝區裡讀過的字元讀取過的字元都移除, 導致整個接收緩衝區的完整性被第一次的 find() 函式破壞, 如果需要對回應進行兩次搜尋, 那麼第二次的 find() 可能永遠也不會找到關鍵字, 即使那個關鍵字確實存在, 因為它可能已經被第一次的 find() 抹除了
    為什麼不直接把傳進來的字元用String存起來之後再做判斷
    superme 发表于 2018-2-14 16:49
    為什麼不直接把傳進來的字元用String存起來之後再做判斷

    感谢回复,但,麻烦您看下,下面用串口调试软件的回复:
    17:00:20 You Send : light off
    ÿ

    Light off!

    ÿÿ

    Light off!


    17:00:21 You Send : light off
    ÿÿÿ

    Light off!

    ÿÿÿÿ

    Light off!


    17:00:22 You Send : light off
    ÿÿÿÿÿ

    Light off!

    ÿÿÿÿÿÿ
    乱码【ÿ】是每次从arduino返回的,如果像您说的,find()会把缓冲区里读取过的字元移除,乱码【ÿ】却每次递增呢?
    这是我最纳闷的……
    因為你是用inputString去存取,沒有清除,再加上你每次都會跑一次for迴圈,所以就會持續累加
    for (int i = 0; i < 1; i++)
           {
             char inChar = (char)Serial.read();
             inputString += inChar;
             delay(100);
           }
    superme 发表于 2018-2-16 23:07
    因為你是用inputString去存取,沒有清除,再加上你每次都會跑一次for迴圈,所以就會持續累加
    for (int i =  ...

    String inputString = "";         // a String to hold incoming data
    那應該搞懂了吧~
    发新帖
    发表评论
    高级模式  
    您需要登录后才可以回帖 登录 | 立即注册  
    关闭

    推荐主题 上一条 /2 下一条