Ausgabe float formatiert auf AVR

Hallo zusammen,

da wir gerade so einen schönen Thread über formatierte HEX-Ausgabe hatten, hier mal was zur formatierten float-Ausgabe. Wie ihr wisst, ist die float-Ünterstützung bei den kleinen AVR-Prozessoren nicht in der printf-Familie drin.

Ich habe da mal eine kleine Funktion gebaut, wie man die Ausgabe trotzdem formatieren kann.

/* Formatiert ein float auf max. Länge des Puffers */

size_t formatFloat(char *puffer, uint8_t pufLen, float wert, uint8_t vorKomma, uint8_t nachKomma) {
uint16_t faktor = 10, ganz, nach;
char format[10] = "%0";
char fnum[2];
  if (nachKomma > 4) {  // unsinnig
    return 0;
  }
  if (vorKomma+nachKomma+2 > pufLen) {  // passt nicht
    return 0;
  }
  for(uint8_t i=0; i < nachKomma-1; i++) faktor *= 10;
  fnum[0] = vorKomma+0x30;
  fnum[1] = '\0';
  strcat(format, fnum);
  strcat(format, "d.%0");
  fnum[0] = nachKomma+0x30;
  strcat(format,fnum);
  strcat(format,"d");
  wert *= faktor;
  ganz = wert / faktor;
  nach = (uint16_t)abs(wert) % faktor;
  sprintf(puffer,format,ganz,nach);
  return strlen(puffer);
}

char puffer[10];
void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  formatFloat(puffer, sizeof(puffer), 11.23,3,1);
  Serial.println(puffer);
  formatFloat(puffer, sizeof(puffer), 11.23,3,2);
  Serial.println(puffer);
  formatFloat(puffer, sizeof(puffer), 11.03,3,2);
  Serial.println(puffer);
  
}

void loop() {}

Gruß Tommy

Hast du dtostrf neu erfunden?
Wenn es um führende Nullen statt Leerzeichen geht, kann man die mit
for(char& c:buffer) if (c == ' ') c = '0'; hinterher "umwandeln".
Wenn man's wirklich braucht


komplett:

char buffer[8];
void setup() {
 Serial.begin(9600);

 float pi {PI};
 Serial.println(pi);
 dtostrf(pi,sizeof(buffer)-1,3,buffer);
 Serial.println(buffer);
 for(char& c:buffer) if (c == ' ') c = '0'; 
 Serial.println(buffer);
}

Man kann auch den AVR Arduinos das float in sprintf beibringen.
Und das printf ebenso.

Danke für den Tipp, ich habe es gefunden und mit sprintf getestet. Geht.

Gruß Tommy

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.