接好线之后,如何写代码读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;//校验字或结束字错误
}