[ESP32] Lire une chaine de caractere avec __flashstringhelper

Bonjour,
J'ai une fonction avec comme paramètre un const __flashstringhelper *, mais la fonctione n'affiche rien.

Pour info j'utilise un ESP32 avec FABGL.

Comment je doit procéder ?

void _cputs_P(const __FlashStringHelper *s) {
  char str[80];
  strcpy_P(str, (const char *)s);
  for (int i; i < strlen(str); i++) {
    _putch(str[i]);    
  }
  
}

void _putch(uint8 c)
{
  if (SERCTL_ENABLED) {
    SEROUT.write(c);
  }

#ifdef FABGL
  Terminal.write(c);
#endif
}

Merci de votre aide.

c'est du code pour un UNO ou MEGA... l'ESP32 n'a pas la même architecture.

il nous faut plus d'infos

Quel genre d'infos ?
C'est la carte FABGL qui a un ESP32 16MB Flash/4MB PSRAM
C'est juste une fonction qui doit afficher une chaine de caractère du genre.

_cputs_P(F("ma chaine"));

quand je tape strcpy_P, ca ne se met pas en couleur orange, c'est possible que

__FlashStringHelper 

N'existe pas pour l'ESP32 ?

Sinon cette fonction fonctionne mais je doit utiliser

PSTR("machaine")  au lieu de
F("ma chaine") en paramètre.
void _cputs_P(PGM_P s)
{
  for (uint8_t i = 0; pgm_read_byte(&s[i]); i++)
  {    
    _putch_P(&s[i]);
  }
}

Je ne sais pas si c'est la meme chose, est ce que la chaine utilise la flash.

Je m'y retrouve plus avec

__FlashStringHelper PGMP, PROGMEM F(), PSTR(), FPSTR() 

je pense que vous pouvez forcer le pointeur vers un char* car la mémoire est directement accessible et pas scindée

essayez de faire simplement

void _cputs_P(const __FlashStringHelper * s) {
  const char *str = (const char *) s;
  for (int i=0; i < strlen(str); i++)  _putch(str[i]);     
}

sur ESP32 ce n'est pas la peine d'utiliser la macro F() car le type PSTR ne fait rien

#define PSTR(s)       (s)

la macro PROGMEM ne fait rien

et toutes les fonctions qui travaillent en PROGMEM sur AVR sont mappées sur les fonctions C standard

Merci pour les informations.
Par contre PSTR fonctionne
et pour la lecture aussi

void _putch_P(PGM_P c)
{
  if (SERCTL_ENABLED) {
    SEROUT.write(pgm_read_byte(c));
  }

#ifdef FABGL
  Terminal.write(pgm_read_byte(c));
#endif

}

Mais mon PSTR ne sert à rien du coup ?

Sur ESP32 - si vous maîtrisez 100% du code - virez tout ce qui concerne les __FlashStringHelper et les fonction avec _P. ça ne sert à rien. au final c'est un const char *

vous n'avez pas non plus besoin de mettre la macro F() partout. les string literals constant sont mis dans le segment data en flash qui est accessible avec un pointeur uniforme - pas comme sur une architecture Harvard

par exemple

la fonction pgm_read_byte() c'est

#define pgm_read_byte(addr)   (*(const unsigned char *)(addr))

et votre type PGM_P

#define PGM_P         const char *

Merci pour ces éclaircissements, c'est ce que je me disais un peu.

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