sprintf 使用上的問題 數據錯誤

int sprintf(char *string, char *format [,argument,...]);

51內核單片機+KEIL51編譯器

在使用AT命令初始化模塊時,使用sprintf進行指令數據值整合

若將數據直接使用%d轉化成整形輸入,數據到buf中出現錯誤

unsigned char xdata buf_a[10] = {0}}, buf_b[10] = {0};

sprintf(buf_a, "val_a=%d\r\n", 1); // 輸出錯誤

sprintf(buf_b, "val_b=%d\r\n", 4);

嘗試將數據值加大測試

sprintf(buf_a, "val_a=%d\r\n", 255); // 一個字節,輸出錯誤
    
sprintf(buf_b, "val_b=%d\r\n", 256); // 兩個字節,出錯正確

輸入常數255的時候,佔一個字節,他就給你分配一個字節,輸入256的時候佔2個字節
他就給你分配兩個字節,兩個字節的數據,則可以輸出正確

驗證數據類型不同,輸出內容
unsigned char xdata val_a = 123;
unsigned int xdata  val_b = 123; 

sprintf(buf_a, "val_a=%d\r\n", val_a);  // char型,一個字節,輸出錯誤
sprintf(buf_b, "val_b=%d\r\n", val_b); // int 型,兩個字節,輸出正確

查閱資料,keil51 內存沒有對齊,在使用1個字節sprintf時出現數據錯亂,

解決方法,在輸出%d時,將數據類型定義成兩個字節以上(short / int)。

 


    
 

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