String en Flash (PROGMEM) et le fonctionnement de sprintf_P

Bonjour a tous,
je rencontre quelque problème avec le fonctionnement de sprintf_P.
dans mon projet tous s'affiche sur un LCD1602 en I2C
Pour gagner de l'espace dans la SRAM j'ai inscrit toutes mes string d'affichage dans la flash soit avec F(...) dans le cas de print et cela marche sans problème,
Par contre pour des affichages avec formatage de valeur flottante j'utilise sprintf_P avec PSTR() et là seul le texte fixe s'affiche et j'ai un point d’interrogation à la place de la valeur.
voici le code pour simplifier j'ai utilise serial a la place du LCD mais même résultat:

#include <avr/pgmspace.h>
#include <LibPrintf.h>
char txtlig[17] = "";
float PosTrv = 0.0;
float PosABS = 0.0;

void setup() {
  Serial.begin(115200);
  while (!Serial)
    ;  // wait for serial port to connect. Needed for native USB
  Serial.println("OK");
}


void loop() {
  static bool flag = true;
  if (flag) {
    //LCD.setCursor(0, 0);
    sprintf_P(txtlig, PSTR("Pos Trv: %2.2f  "), PosTrv);
    //LCD.print(txtlig);// cette ligne donne a l'écran: [Pos Trv:  ?     ]
    Serial.println(txtlig);
    //LCD.setCursor(0, 1);
    sprintf(txtlig, "Pos Absol: %2.2f", PosABS);
    //LCD.print(txtlig);// cette ligne donne à l'écran: [Pos Absol: 0.00 ]
    Serial.print(txtlig);
    flag = false;
  }
}

J'ai fouillé un peut partout sur le net mais je n'ai pas trouvé d'indice si ce n'est que sprinf_P est defini dans stdio.h et sprintf dans printf.h.

si quelqu'un a une solution a me proposer je suis preneur.
cordialement

Bonjour,

Tu ne précises pas la carte que tu utilises.
Si tu utilises une carte avec processeur AVR, les flottants ne sont pas supportés par sprintf. Il faut utiliser dtostrf pour formater les flottants.

Bonjour,
Effectivement j'ai oublié de préciser la carte c'est une arduino Uno Rev3 avec un ATMEGA328P.
si sprinf_P ne supporte pas les flottant cela signifie qu'il faut faire :

    //LCD.setCursor(0, 0);
    char txt[6]="";
    dtostrf(PosTrv, 2,2, txt);
    sprintf_P(txtlig, PSTR("Pos Trv: %s  "), txt);
    //LCD.print(txtlig);// cette ligne donne a l'écran: [Pos Trv:  0.00     ]
    Serial.println(txtlig);
    //LCD.setCursor(0, 1);
    sprintf(txtlig, "Pos Absol: %2.2f", PosABS);
    //LCD.print(txtlig);// cette ligne donne à l'écran: [Pos Absol: 0.00 ]
    Serial.print(txtlig);
    flag = false;

ou bien surcharger le sprintf_P pour qu'il supporte les flottants

je vais regarder cela de près.

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