調試小細節之數據類型佔用字節

最近手裏有一款溫溼度傳感器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;

這裏就是因爲忽略了一個小小的數據類型長度的問題,導致將位移後的十六位的數據賦值給了一個八位的變量,導致結果始終不正確,問題雖小,不留心缺很難查出,做個小記提醒自己。

發佈了31 篇原創文章 · 獲贊 18 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章