Accents francophoneS dans le port série

UECIDE C'est totalement extra, et c'est extra pour plus que juste les accents.

Pour ce qui est de la France, je crois que c'est un territoire perdu. À trop prendre quelque chose pour acquis, on fini par le perdre. Le Centre de la Francophonie, c'est maintenant le Québec, ce qui est totalement ironique, et dangereux, puisque nous nous trouvons dans la zone frontale de la bataille.

Bonjour les copains,
Personnellement, ne pas avoir les accentués quand j'utilise la ligne série USB est extrèmement pénalisant. Je peux vous proposer une petite procédure qui non seulement permet d'avoir tous les accentués, mais également certains caractères spéciaux. Enfin, si l'on désire que suite au texte on passe à la ligne, il suffit de passer 1 ou true comme paramètre pour le booléen CR.
Voici ma procédure ainsi que la façon de l'invoquer dans le programme :

/* Procédure d'affichage des caractères accentués et de certains
        caractères particuliers sur la ligne série USB.           */

void setup() {Serial.begin(115200);}
  
void loop() {
  PrintUSB("Test sur les accentués. ",1);
  PrintUSB("µ œ ü û ù ö ô ï î ë ê é è ä â à ",0);
  PrintUSB("Ç È É Ê Î Ô À Â FIN.",1);
  INFINI: goto INFINI; }
  
void PrintUSB(String TEXTE,boolean CR) {
  /* Pour gagner de la place mémoire il suffit dans les case
     d'effacer les lignes correspondant à des caractères non
     utilisés. (Gain : 8 octets par case enlevé) Il est également
     utile d'effacer les lignes des tests correspondant au "µ" et
     au "œ" si ces caractères ne sont pas affichés par le programme.
     (Gain : 14 octets par test enlevé) */
  int CAR;
  for (byte I=0; I < TEXTE.length(); I++) {
       if ((byte (TEXTE[I]) == 0xC3)|| // Cas banal.
          (byte (TEXTE[I]) == 0xC2)|| // Si "µ" utilisé.
          (byte (TEXTE[I]) == 0xC5))  // Si "œ" utilisé. 
          {CAR = int(TEXTE[++I]); //Serial.println(CAR); 
           switch (CAR) {
             case -68 : {Serial.print(char (252)); break;} // ü
             case -69 : {Serial.print(char (251)); break;} // û
             case -71 : {Serial.print(char (249)); break;} // ù
             case -74 : {Serial.print(char (246)); break;} // ö
             case -75 : {Serial.print(char (181)); break;} // µ
             case -76 : {Serial.print(char (244)); break;} // ô
             case -81 : {Serial.print(char (239)); break;} // ï
             case -82 : {Serial.print(char (238)); break;} // î
             case -85 : {Serial.print(char (235)); break;} // ë
             case -86 : {Serial.print(char (234)); break;} // ê
             case -87 : {Serial.print(char (233)); break;} // é
             case -88 : {Serial.print(char (232)); break;} // è
             case -89 : {Serial.print(char (231)); break;} // ç        
             case -92 : {Serial.print(char (228)); break;} // ä      
             case -94 : {Serial.print(char (226)); break;} // â
             case -96 : {Serial.print(char (224)); break;} // à
             case -109 : {Serial.print(char (156)); break;} // œ         
             case -126 : {Serial.print(char (194)); break;} // Â
             case -128 : {Serial.print(char (192)); break;} // À
             case -108 : {Serial.print(char (212)); break;} // Ô
             case -114 : {Serial.print(char (206)); break;} // Î
             case -118 : {Serial.print(char (202)); break;} // Ê
             case -119 : {Serial.print(char (201)); break;} // É            
             case -120 : {Serial.print(char (200)); break;} // È             
             case -121 : {Serial.print(char (199)); break;}}} // Ç
       else Serial.print(TEXTE[I]);}
  if (CR) Serial.println(); }

J'espère qu'elle vous sera utile. Amicalement : Nulentout.

Bonour,
Je viens de tester la librairie du post 18 mais je n'obtiens pas le résultat escompté...

Caractères accentués
Caract�res accentu�s
���������������

Que fais-je de faux???

Merci

J'ai eu dernièrement la surprise de voir que les accents étaient maintenant acceptés dans le serial monitor de l'IDE.

  • IDE 1.8.0
  • Debian Jessie (8.6)
    -Java 8 --> version Debian (OpenJava 8)

En effet sur le nouvel IDE ça fonctionne mais bon but était d'utiliser cette librairie pour remplacer les caractères accentués d'une chaîne de caractère en vue de l'envoyer sur un LCD.

Mais pourquoi la librairie remplace tous les accents par � ?

On devrait obtenir "Caracteres accentues" !! Non?

Merci

Bonjour

Est-ce que j'utilise mal cette librairie ou y a-t-il un problème de fonctionnement?

Merci

Bonjour

Ce qu'il faut comprendre, c'est que c'est le terminal qui décide d'afficher tel ou tel caractère graphique en fonction de ce qu'il reçoit.

Il faut aussi appréhender un minimum le header de librairie pour comprendre les services qu'elle rend.

La librairie ne sert qu'à transcoder en fonction du format attendu par le périphérique d'affichage.

A la lecture des quelques posts ci-dessus, je devine que le terminal intégré à l'IDE a changé de mode de fonctionnement.
Dans les versions antérieures, il appliquait la norme unicode pour traiter les textes reçus de l'arduino.
Là j'ai l'impression qu'il a basculé vers autre chose.

Fais un test de transco dans les autres formats pour voir lequel s'affiche bien. Par exemple :

#include "Accents.h"

char toto[] = "Caractères accentués";
char complet[] = "àâäçèéêëîïôöùûü";

void setup()
{
  char ligne[200];

  Serial.begin(9600);

  Serial.println("\nUnicode");
  Accents.transcoder_UNICODE(toto, ligne, 200);
  Serial.println(ligne);
  Accents.transcoder_UNICODE(complet, ligne, 200);
  Serial.println(ligne);

  Serial.println("\nASCII");
  Accents.transcoder_ASCII(toto, ligne, 200);
  Serial.println(ligne);
  Accents.transcoder_ASCII(complet, ligne, 200);
  Serial.println(ligne);

  Serial.println("\nUTF8");
  Accents.transcoder_UTF8(toto, ligne, 200);
  Serial.println(ligne);
  Accents.transcoder_UTF8(complet, ligne, 200);
  Serial.println(ligne);

  Serial.println("\nHTML");
  Accents.transcoder_HTML(toto, ligne, 200);
  Serial.println(ligne);
  Accents.transcoder_HTML(complet, ligne, 200);
  Serial.println(ligne);

  Serial.println("\nsans");
  Accents.Supprimer(toto, ligne, 200);
  Serial.println(ligne);
  Accents.Supprimer(complet, ligne, 200);
  Serial.println(ligne);
}

void loop()
{
}

Pour répondre plus précisément à la question : il me semble qu'en unicode comme en utf8, les caractères accentués sont codés sur deux octets.
En gros, le premier est un "marqueur" de caractère spécial, le second donne le caractère spécial lui-même.

Donc je dirais que le caractère qui s'affiche de manière bizarre dans ton terminal (le losange avec un point d'interrogation) correspond au "marqueur" unicode, preuve que le terminal n'interprète pas correctement le flux reçu.

En ce qui concerne l'affichage de caractères accentués sur un LCD 2x16 ou 4x20, basé sur le contrôleur standard HD44780

En natif, le LCD ne gère pas les caractères accentués.
La solution la plus simple est de supprimer les accents avant affichage, via la librairie fournie.

Mais c'est moche. :slight_smile:

Après, il y a la possibilité de redéfinir graphiquement jusqu'à 8 caractères affichables simultanément.
Et là on peut faire ce qu'on veut.

Personnellement, je me suis redéveloppé une surcouche logicielle pour gérer tout ça proprement.
Cette surcouche prend en entrée des textes au format ASCII étendu, incluant des caractères accentués.

Derrière, elle ajuste à la volée les caractères personnalisables du LCD, pour afficher correctement les caractères accentués (ainsi que la lettre g qui est très moche en standard, ainsi que le caractère ° souvent utilisé pour afficher des températures).

Et en dernier recours, s'il y a plus de 8 caractères spéciaux à afficher simultanément, certaines lettres perdent leur accent.

J'ai pu ainsi développer un automate dans lequel certains messages sont stockés une seule fois en progmem (en UTF8), et affichés correctement aussi bien sur un LCD (ASCII), sur le terminal (unicode) et dans les pages web (HTML).

C'est pour cet automate que j'ai isolé les conversions dans la bibliothèque Accents ci-dessus

Super Bricoleau, merci pour ces explications!

Je désirais ôter les accents et n'ai pas utilisé la bonne fonction!!! Mais avec, c'est ok! C'est vrai que c'est moyennement joli sans les accents mais c'est toujours mieux que des caractères bizarres.

Par contre je ne peux afficher que 16 char, donc s'il n'y a pas d'accent il faut charger 16 char et au pire s'il y a des accents sur les 16char il faut charger 32 éléments vu que ceux-ci sont codés sur 2 octets. Il va falloir que je bidouille cela!

Malheureusement sur le display utilisé on ne peut pas créer des caractères personnalisés :frowning:

Merci en tout cas d'avoir partagé cette bibliothèque et ces infos!