wuzirui 发表于 2015-12-1 18:27:44

关于传感器串口通讯"Serial.available()"使用

前几天买了一个pm2.5灰尘浓度传感器,看到网上有段代码是这样的:
void loop(){

while (Serial.available()>0){
   
    data=Serial.read();
      if(data == 170){
             z=0;
          incomeByte=data;
      }else{
             z++;
          incomeByte=data;
      }
      if(z==6)
      {
          sum=incomeByte+ incomeByte+ incomeByte + incomeByte;
         
             if(incomeByte==sum && incomeByte==255 )
             {

               Serial.print("Data OK! ");
                Serial.print(" | Vo=");
                  float vo=(incomeByte*256.0+incomeByte)/1024.0*5.00;
                Serial.print(vo,2);
                Serial.print("V");
                  float v1=analogRead(A0)/1024.0*5.00;
            Serial.print("/ Ao=");
            Serial.print(v1,2);
            Serial.print("V| ");
                  float c=vo*200;
            Serial.print(c,2);
            Serial.print("ug/m3 | ");

                   for(int k=0;k<7;k++)
                           {
                           Serial.print(incomeByte);
                           Serial.print("|");
                            }
                         Serial.println();
                                 }else{
                            z=0;
                            Serial.flush();
                            data='/0';
                            for(int m=0;m<7;m++){incomeByte=0;}
                            error++;
                      Serial.print(" ### This is ");
                      Serial.print(error);
                      Serial.println(" Error ###");
                     }
                     z=0;
      }
}

}

不太明白为什么要用"while(Serial.available() > 0 )"这条语句,我记得"Serial.available()"这条命令是用来检测pc端发出的数据,而原作者显然是将它当作检测传感器返回数据使用的,求大神帮忙

Super169 发表于 2015-12-1 18:45:26

只是一個 true/false 的 expression, 因為 available 本來是回傳有多少數據可用.

Returns

the number of bytes available to read

但 c++ 中, 0 是用來代表 false, 任何非 0 的數值都會被看成為 true.
即使 Serial.available() 是回傳 true / false, 也沒有分別, true 一般的值是 1, 也是 > 0 的.

while (Serial.available()) 或者 while (Serial.available() > 0) 結果都是一樣, 兩者均可, 看個人習慣.
我自己比較懶, 所以也偏向用 while (Serial.available()), 而且閱讀起來也簡單清楚一點.

lqh 发表于 2016-1-12 09:55:49

本帖最后由 lqh 于 2016-1-12 09:57 编辑

个人对这个问题的理解有三点:一是Serial.available()是函数,不是命令;二是这个函数可用与任何具有标准Serial的端口通信,不一定非得是PC;三是从程序上看,你的arduino串口就是应当接pm2.5灰尘浓度传感器的Serial端口。以上三点,不知道对不对哈?
页: [1]
查看完整版本: 关于传感器串口通讯"Serial.available()"使用