2016-11-03 88 views
-3

平臺:ESP8266和Arduino的功能uint16_t VAR打印到4位將無法正常工作

我在4個字符地方試圖輸出uint16_t。激光(VL53L0X)正從2至4號的地方讀書。(永遠不會超過4個地方,MAX 8190出)

Serial.print(mmLaser); 

作品,但不能格式化4個地方。
如果我調用該函數,我得到一個錯誤

**ERROR:** invalid conversion from 'char' to 'char*' [-fpermissive] 

,如果我沒有編譯調用該函數:沒有錯誤

我在做什麼錯?

聲明瓦爾

char c_temp; 
uint16_t mmLaser = 0; // hold laser reading 

函數調用

uint16_2_char(mmLaser, c_temp); 
Serial.print(c_temp); 

功能

// Convert uint16_t to char* 
// param 1 n - uint16_t Number 
// param 2 c - char to return char value to 
// 
void uint16_2_char(uint16_t n, char* c){ 
    sprintf(c, "%04d", (int) n); 
} 
+0

什麼是你的編譯器有說關於傳遞一個'char'函數期待'char *'? – EOF

+1

'char c_temp;' - >'char c_temp [100];'猜猜我不信任_never_中「永遠不會超過4個地方」。更好地將緩衝區大小設置爲int所產生的最大值。 – chux

+0

我發現自己很奇怪,我在指出unsigned int *沒有小數位*。這並不意味着這是一個奇怪的問題拼圖。請閱讀[問]。把它放在心上。提供一個[mcve] – Tibrogargan

回答

0

代碼需要的字符數組

//  Pointer to a character -----v        
void uint16_2_char(uint16_t n, char* c){ 
    sprintf(c, "%04d", (int) n); 
} 

問題代碼

//  This is one character 
char c_temp; 

uint16_t mmLaser = 0; // hold laser reading 

// **ERROR:** invalid conversion from 'char' to 'char*' 
// Does not make sense to pass a character when an address is needed 
// Need to pass the initial _address_ as an array of characters instead. 
//       v 
uint16_2_char(mmLaser, c_temp); 

更好的代碼

#define INT_BUF_SIZE 24 
char buffer[INT_BUF_SIZE]; 

// When an array is passed to a function, 
// it is converted to the address of the 1st character of the array. 
// The function receives &buffer[0] 
uint16_2_char(mmLaser, buffer); 

更妙的是,通過一個地址和可用大小

void uint16_2_char(uint16_t n, char* c, size_t sz){ 
    unsigned u = n; 
    // I'd expect using unsigned types. (use `%u`) 
    // snprintf() will not not overfill the buffer 
    snprintf(c, sz, "%04u", u); 
} 

char buffer2[INT_BUF_SIZE]; 
uint16_2_char2(mmLaser, buffer, sizeof buffer);