最近手裏有一款溫溼度傳感器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;
這裏就是因爲忽略了一個小小的數據類型長度的問題,導致將位移後的十六位的數據賦值給了一個八位的變量,導致結果始終不正確,問題雖小,不留心缺很難查出,做個小記提醒自己。