中级会员
 
- 积分
- 300
- 金钱
- 300
- 注册时间
- 2013-8-19
- 在线时间
- 0 小时
|
原子的DHT11温湿度传感器
u8 am2302_Read_Data(u8 *temp1,u8 *temp2,u8 *humi1,u8 *humi2)
{
u8 buf[5];
u8 i;
am2302_Rst();
if(am2302_Check()==0)
{
for(i=0;i<5;i++)
{
buf=am2302_Read_Byte();
}
for(i=0;i<5;i++){
printf("buf%d=%d ",i,buf);
printf("\n");
}
if(((buf[0]+buf[1]+buf[2]+buf[3])&0xff)==buf[4])//
{
printf("read ok! \n");
*humi1=buf[0];
*humi2=buf[1];
*temp1=buf[2];
*temp2=buf[3];
}
}else return 1;
return 0;
}
黄色部分为修改的地方,源程序为if(((buf[0]+buf[1]+buf[2]+buf[3]))==buf[4])
这里对buf0--3取低8位和buf4比较,才符合传感器的格式要求。
笔者在试验时,出现
buf0=3
buf1=168
buf2=0
buf3=254
buf4=169
TEMP_VALUE=6303
HUMIDITY=23
读取AM2302成功!
湿度为2.3 %RH ,温度为 118.3℃
buf[0]+buf[1]+buf[2]+buf[3]>buf[4];
此时程序并没有执行相关于buf的赋值语句,起初笔者也不清楚传回主函数的温湿度值是怎么得到的,于是给变量赋初值为0;
即:u8 temperature1=0,temperature2=0;
u8 humidity1=0,humidity2=0;
而后的数据显示:
buf0=1
buf1=120
buf2=0
buf3=249
buf4=114
TEMP_VALUE=0
HUMIDITY=0
读取AM2302成功!
湿度为0.0 %RH ,温度为 0.0℃
可见am2302_Read_Data()中关于buf赋值的语句没有执行,那么是什么原因呢?
原来是由于数据截断所引起的。
我们来在visual中实验一下:
int main(void)
{
unsigned char a=255;
unsigned char b=255;
unsigned char c=a+b;
int d=c;
cout<<c<<" "<<a+b<<endl;
cout<<d<<" "<<((a+b)&0xff)<<endl;
return 0;
}
可见,纵使a,b分别被定义为8位的uchar变量,但是打印出来的依然是超出8位,而通过d=a+b打印出来的结果就是我们一般意义上的认知。此处阐释了一个问题,就是,只有在进行赋值的时候,才会出现数据截断,所以单纯使用if(((buf[0]+buf[1]+buf[2]+buf[3]))==buf[4])是有问题的。
最后,show一下更改之后的结果:
buf0=1
buf1=146
buf2=1
buf3=0
buf4=148
read ok!
TEMP_VALUE=256
HUMIDITY=402
读取AM2302成功!
湿度为40.2 %RH ,温度为 25.6℃
|
|