Bonjour
Je suis en cours de développement d'un programme assez verbeux pour arduino, avec plusieurs canaux de sortie des messages :
- Liaison série
- Ecran LCD
- Serveur HTTP
- Serveur UDP
Chaque message est stocké en mémoire flash (utilisation de PROGMEM), et peut contenir des caractères accentués (je programme français, moi monsieur :P).
Evidemment, il faut un filtre pour chaque sortie mais ça je maîtrise (Liaison série é=>e, HTTP é => é, LCD é => caractère personnalisé, UDP non filtré, etc.)
Mon problème est que je n'arrive pas à stocker correctement les caractères accentués dans ma chaîne initiale.
Par exemple, l'instruction ci-dessous ne donne pas le résultat attendu
prog_char lib_parm08[] PROGMEM = "Périodicité des relevés de température";
Voici quelques lignes de code permettant de cerner le problème (sans PROGMEM mais c'est kif)
char maligne[] = "caractère accentué abc";
void setup(){
Serial.begin(9600);
Serial.println(maligne); //affichage de la ligne entière
uint8_t i=0;
while (maligne[i]) //affichage caractère par caractère
{
Serial.print(maligne[i]);
Serial.print(',');
Serial.print((uint8_t) maligne[i], DEC);
Serial.println();
i++;
}
Serial.println();
Serial.println('é'); //un caractère littéral accentué seul ?
Serial.println();
char moncar = 'é'; //un caractère seul ?
Serial.print(moncar);
Serial.print(',');
Serial.print((uint8_t) moncar, DEC);
Serial.println();
moncar = (char) 130; //et avec le bon code ascii ?
Serial.print(moncar);
Serial.print(',');
Serial.print((uint8_t) moncar, DEC);
Serial.println();
}
void loop(){
}
Avec pour résultat :
caractère accentué abc
c,99
a,97
r,114
a,97
c,99
t,116
Ã,195
¨,168
r,114
e,101
,32
a,97
c,99
c,99
e,101
n,110
t,116
u,117
Ã,195
©,169
,32
a,97
b,98
c,99-15447
©,169
<un caractère spécial en forme de carré, non représentable ici>,130
J'en déduis donc que le compilo :
- utilise deux octets pour stocker les caractères accentués contenus dans une chaîne littérale (par ex : é => 195.169), selon une nomenclature que je ne connais pas.
- considère le littéral 'é' comme un int (195*256+169+15447 = 65536 CQFD), et du coup ne laisse que l'octet LSB quand je le balance dans un char.
En synthèse, est-ce que quelqu'un sait me dire comment coder ma chaîne littérale pour que cet abruti de compilo comprenne que je veux qu'il me stocke la valeur 130 dans l'octet correspondant au 'é' inclus dans ma chaîne ?
Je veux juste ça, pitié, SVP et tout le reste fonctionnera.
PS : le compilo en question c'est celui de l'IDE Arduino standard (spa bien je sais, mais je débute et je n'ai pas encore creusé de solution alternative).