OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5591|回复: 4

关于原子《DHT11》代码的BUG解决

[复制链接]

38

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2013-8-19
在线时间
0 小时
发表于 2014-4-29 20:24:06 | 显示全部楼层 |阅读模式
原子的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℃ 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-29 23:31:43 | 显示全部楼层
回复 支持 反对

使用道具 举报

17

主题

466

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2164
金钱
2164
注册时间
2013-1-11
在线时间
510 小时
发表于 2015-4-2 14:26:22 | 显示全部楼层
楼主,你好,见你使用的是AM2302,我照着原子哥DHT11的程序更改了,还是以一直无法读出准确数据,你可以将你的代码给我看看吗?谢谢了!
知识是你最好的财富
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-5-13
在线时间
0 小时
发表于 2015-5-13 12:37:42 | 显示全部楼层
回复【3楼】默默莱:
---------------------------------
你好,请问你的程序找到了吗,或者调出来了吗,我现在也调不出来程序,如果有能让看看?谢谢
回复 支持 反对

使用道具 举报

17

主题

466

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2164
金钱
2164
注册时间
2013-1-11
在线时间
510 小时
发表于 2015-5-13 14:31:56 | 显示全部楼层
回复【4楼】负点电子:
---------------------------------
void DHT11_Rst(void)    
{                 
DHT11_IO_OUT(); 
    DHT11_DQ_OUT=0; 
    delay_ms(1);    
    DHT11_DQ_OUT=1; 
delay_us(30);     
}
知识是你最好的财富
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 13:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表