2016-11-03 4 views
-3

Plattform nicht: Esp8266 und ArduinoFunktion uint16_t var 4 Plätze zu drucken

Ich versuche, ein uint16_t in einer 4-char Stellen ausgegeben. Der Laser (VL53L0X) wird immer von 2 bis 4 Anzahl Stellen zu lesen.

(wird niemals mehr als 4 Plätze, MAX 8190 heraus gehen)
Serial.print(mmLaser); 

Werke, sondern kann die 4 Plätze nicht formatiert werden.
wenn ich die Funktion aufrufen, bekomme ich einen Fehler

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

wenn ich ohne Aufruf der Funktion kompilieren: keine Fehler

Was mache ich falsch?

erklärt Vars

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

Funktion genannt

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

Funktion

// 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

passieren Was macht Ihr Compiler müssen über das Übergeben eines Char an eine Funktion erwartet ein 'char *'? – EOF

+1

'char c_temp;' -> 'char c_temp [100];' Schätze ich vertraue nicht dem _never_ in "wird niemals über 4 Plätze gehen". Besser, die Größe des Puffers auf das Maximum zu bringen, das ein 'int' erzeugen würde. – chux

+0

Ich finde mich seltsam befremdet, dass ich darauf hinweise, dass unsigned ints * keine Dezimalstellen * haben. Es hilft nicht, dass dies ein seltsames Puzzle einer Frage ist. Bitte lesen [fragen]. Nimm es zu Herzen. Stellen Sie eine [mcve] – Tibrogargan

Antwort

0

-Code benötigt ein Array von Zeichen

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

Problem Code

//  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); 

Bessere Code

#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); 

noch besser, eine Adresse und die Größe verfügbar

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);