接好线之后 ,如何写代码读PM2.5传感器数值呢?写代码之前 ,我们要缕清思路。认真的看懂数据协议,画出简单的流程图,这样能帮我们更好的设计组织代码。

几个关键:

1判断帧头;

2判断接收字节数;

3判断校验和;

4计算PM2.5数值。

根据上面的几点,我们可以画出读取传感器数值的流程图:

读取PM2.5传感器软体流程图

程序中,我们将用到两个关键函数,就是Serial.available()和Serial.read();其中Serial.available()是用来判断串口的接收缓存是否有数据,有数据就返回数据个数,没有就返回0;

Serial.read()是用来读取串口接收缓存数据的,返回一个字节数据,这里我们知道发送的是无符号16进位数,因此使用一个整形变量来接收。

如果使用的软串口,把Serial换成自己声明的变量就可以了。

下面是读取传感器子函数的原始码:

floatGetPM25Data()//读取PM2.5传感器

{

intcnt=0;//帧计数

intdata=0;//接收字节

intrevbuf[7];//接收缓存

intdsize=0;//串口接收计数

while(softSerial.available()>0){//软串口有效

data=softSerial.read();//通过软串口读一个字节

dsize++;//读取字节计数

if(dsize>200)//没有遇到正确的帧标志,超时退出

{

return-1;

}

if(cnt==0)

{

if(data==0xAA)//得到帧头

{

revbuf[0]=data;

cnt++;

}

}else{

revbuf[cnt++]=data;

}

if(cnt==7)//帧计数

{

break;//退出循环

}

}

intsum=revbuf[1]+revbuf[2]+revbuf[3]+revbuf[4];//计算校验字

if(revbuf[5]==sum&&revbuf[6]==0xff)//判断校验字和结束字

{

floatvo=((revbuf[1]<<8)+revbuf[2])/1024.0*5.00;//计算PM2.5值

returnvo*800;//返回PM2.5读数

}

return-1;//校验字或结束字错误

}