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.
J-M-L
December 18, 2022, 7:04pm
2
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()
J-M-L
December 18, 2022, 7:24pm
5
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 ?
J-M-L
December 18, 2022, 7:45pm
7
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.
system
Closed
June 16, 2023, 7:49pm
9
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.