Difficultés avec sprintf (parser message RFlink)

Bonjour, me revoici de nouveau coincé !
J'utilse Rflink Small sur un Nano. j'ai épuré le code au maximum de mes possibilités.
mais j'ai du mal avec sprintf.
Les variables sont:

  • wspeed
  • awspeed
  • Le code du plugin d'origine est:
sprintf(pbuffer, "WINSP=%04x;", wspeed);     
            Serial.print( pbuffer );
sprintf(pbuffer, "AWINSP=%04x;", awspeed);     
            Serial.print( pbuffer );

Cela formate correctement, mais en HEXA.
J'ai besoin de décimal. J'ai modifié la ligne afin d'avoir une sortie Décimale de cette façon:

sprintf(pbuffer, "WINSPM=%04d;", wspeed);     
        Serial.print( pbuffer );
sprintf(pbuffer, "AWINSPM=%04d;", awspeed);     
        Serial.print( pbuffer );

j'ai suivit cette page ICI
et j'obtiens bien ma sortie en Décimale Oregon;ID=1A04;WINDIR=0002;WINSPHexa=006e;WINSPM=0110;AWINSPHexa=0002;AWINSPM=0002;BAT=OK
006e-->0110.
0002-->0002.
-Mais je n'arrive pas dans sprintf a diviser par 100 le résultat (en M/s )et a le multiplier par 3.6 pour passer en (Km/H.)
Alain

Le format %d attend un entier

Si vous avez écrit wspeed * 3.6 / 100 Vous avez promu le résultat du calcul en nombre réel (à virgule). Si vous voulez vraiment un entier il faut le reconvertir et écrire (int) (wspeed * 3.6 / 100)

(Ou passer avec un long suivant le besoin)

Bonsoir.
He bien non!! , j'avais pas pensé. Focalisé sur Sprintf
Maintenant comme conseillé ci dessus ça marche.
Merci beaucoup

j'en profite pour demander, toujours dans Rflink si j'utilise la bonne méthode pour afficher la direction du vent en économisant l'espace mémoire du Nano.

  • Dans la variable wdir

sprintf(pbuffer, ";WINDIR=%04d;", wdir);
je récupère un nombre de 0 a 15 qui représente 16 positions possible de mon indicateur de direction du vent.
Je les utilisent comme ceci: (je reste un grand débutant)
Les Serial.print c'est pour la "mise au point" au final c'est une structure qui sera utilisée, appelée par IC2

  switch (wdir){
      case 0:  Serial.print(F(";N;"   )); break;
      case 1:  Serial.print(F(";NNE;" )); break;
      case 2:  Serial.print(F(";NE;"  )); break;
      case 3:  Serial.print(F(";NEE;" )); break;
      case 4:  Serial.print(F(";E;"   )); break;
      case 5:  Serial.print(F(";SEEE;")); break;
      case 6:  Serial.print(F(";SE;"  )); break;
      case 7:  Serial.print(F(";SSE;" )); break;
      case 8:  Serial.print(F(";S;"   )); break;
      case 9:  Serial.print(F(";SSW;" )); break;
      case 10: Serial.print(F(";SW;"  )); break;
      case 11: Serial.print(F(";SWW;" )); break;
      case 12: Serial.print(F(";W;"   )); break;
      case 13: Serial.print(F(";NWW;" )); break;
      case 14: Serial.print(F(";NW;"  )); break;
      case 15: Serial.print(F(";NNW;" )); break;
      }

Oui ça met le texte en mémoire flash. Vous pourriez aussi utiliser PROGMEM et faire un tableau à 15 entrées (toutes de la même taille) et utiliser votre variable comme index plutôt que de faire un switch

ça, c'est plutôt ENE
Tu as, dans l'ordre : N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW