最近手里有一款温湿度传感器AM2105,通信接口为单总线通信,介绍如下:
当我按照时序正确的读取四十位数据后,按照高位左移八位或上低八位得出实际数据,但是结果却是错误的,而且多次查找都没有找到问题点;
程序如下:
/*******¶Á40λÊý¾Ý********/
void read_hum_temp(void)
{
uint8_t a;
AM2301_Start();
hum_h = read_byte(); //读取湿度高位
hum_l = read_byte(); //读取湿度低位
temp_h = read_byte(); //读取温度高位
temp_l = read_byte(); //读取温度低位
check = read_byte(); //校验位
while((!DAT_Val_IN)&&(cnt < 6))
{
cnt++;
delay_us(10);
}
cnt = 0;
Dat_out();
DAT_Val_OUT = 1;
a =hum_h+hum_l+temp_h+temp_l; //校验和
if(a == check) //校验正确
{
temp_am2105 = 0; //清零
hum_am2105 = 0;
if(temp_h&0x80) //读取温度
{
temp_h = temp_h&0x7f;
temp_am2105 = -((temp_am2105|temp_h)<<8)|temp_l;
}
else
{
temp_am2105 = ((temp_am2105|temp_h)<<8)|temp_l;
}
hum_am2105 = (hum_h<<8)|hum_l; //读取湿度
}
else
{
hum_am2105 = 0;
temp_am2105 = 0;
}
}
后来经别人帮忙代码走查发现问题如下:
uint8_t hum_am2105;
int8_t temp_am2105;
改为如下得出正确温湿度数据:
uint16_t hum_am2105;
int16_t temp_am2105;
这里就是因为忽略了一个小小的数据类型长度的问题,导致将位移后的十六位的数据赋值给了一个八位的变量,导致结果始终不正确,问题虽小,不留心缺很难查出,做个小记提醒自己。