Utilisation de deux serials distinct

Bonjour
j ai actuellement une mega sur la quelle est installer un data logger qui peut gere deux compteurs Enedis Linky
le protocle de transfert serie est en 1200 bit parite even et bien sur il transmet sur la pin 1 vu qu 'a l orignine il etait prevu pour une UNO.

je voudrais pouvoir traiter les trames teleinfo en serial1 ou autre pour pouvoir utiliser le terminal ide en debug mais je ne trouve pas la solution et je plante les info des que je touche aux fonctions serial.

point complementaire il y a aussi une Rtc integre sur la carte et une sd , la sd ne fonctionne pas sur le datalogger, j utilise donc la sd de ma carte officielle ethernet pour un serveur embarquer .
ci dessous un extrait du code utiliser jusqu' a present

           /*************** initialisation ***************/
    void setup()
  {
  pinMode(10, OUTPUT); digitalWrite(10, HIGH);
  // initialisation du port 0-1 lecture Téléinfo
  Serial.begin(1200); UCSR0C = B00100100; 
  #ifdef message_systeme_USB
  Serial.println(F("-Releve Compteur LA NOUE   "));
  #endif
  // verification de la présence de la microSD et si elle est initialisée:
  #ifdef message_systeme_USB
  if (!SD.begin(chipSelect)) {
    Serial.println(F(" > Erreur carte, ou carte absente !"));
  }
  Serial.println(F(" > microSD initialisee !"));
     if (!SD.exists("index.htm")) {
    Serial.println("Erreur!!! fichier index.htm absent!");
  }
    else Serial.println(" > Ok fichier index.htm present! ");
     if (!SD.exists("recupCSV.htm")) {
    Serial.println("Erreur!!! fichier recupCSV.htm absent!");
  }
     else Serial.println(" > Ok fichier recupCSV.htm present! ");
     if (!SD.exists("reglRTC.htm")) {
    Serial.println("Erreur!!! fichier reglRTC.htm absent!");
  }
   else Serial.println(" > Ok fichier reglRTC.htm present! ");
     if (!SD.exists("ConsJour.htm")) {
    Serial.println("Erreur!!! fichier Conso Jour absent!");
  }
 else  Serial.println(" > Ok fichier fichier Conso Jour present! ");  
  #endif
  
  Ethernet.begin(mac, ip);
  server.begin();

  #ifdef message_systeme_USB
  Serial.print(" > IP Serveur: ");
  Serial.println(Ethernet.localIP());
  #endif

  /****initialisation des sorties selection compteur ****/
  pinMode(LEC_CPT1, OUTPUT);digitalWrite(LEC_CPT1, HIGH);
  pinMode(LEC_CPT2, OUTPUT);digitalWrite(LEC_CPT2, LOW);
   /**** initialisation Affichage LED****/
  pinMode(LEDVERTE, OUTPUT); digitalWrite(LEDVERTE, HIGH); pinMode(DEMVERTE, OUTPUT); digitalWrite(DEMVERTE, HIGH);
  pinMode(LEDBLEU, OUTPUT); digitalWrite(LEDBLEU, HIGH); pinMode(DEMROUGE, OUTPUT); digitalWrite(DEMROUGE, HIGH);
  pinMode(LEDROUGE, OUTPUT); digitalWrite(LEDROUGE, HIGH); pinMode(DEMBLEU, OUTPUT); digitalWrite(DEMBLEU, HIGH);
  pinMode(AUJROUGE, OUTPUT); digitalWrite(AUJROUGE, HIGH); pinMode(AUJVERTE, OUTPUT); digitalWrite(AUJVERTE, HIGH);
  pinMode(AUJBLEU, OUTPUT); digitalWrite(AUJBLEU, HIGH); pinMode(LEDHC, OUTPUT); digitalWrite(LEDHC, HIGH);
  /**** initialisation sorties relais de commande****/
  pinMode(OPTO, OUTPUT); digitalWrite(OPTO, HIGH);
  pinMode(BATCHARGE,OUTPUT);digitalWrite(BATCHARGE,HIGH);pinMode(RST,OUTPUT);digitalWrite(RST,HIGH);
  /****initialisation des capteurs****/
   pinMode(SONDE, INPUT);pinMode(PSECTEUR, INPUT);
  pinMode(FLUX_TELEINFO, INPUT);
  /**** initialisation RTC****/
   Wire.begin();

  #ifdef message_systeme_USB
   if (!(DS1307isrunning())) {
    Serial.println(F("RTC non configure !"));
  #endif
  }
  RTCgetTime();    // lecture de l'horloge

  format_date_heure();

  #ifdef message_systeme_USB
  Serial.print(F(" > Horloge RTC OK:"));
  Serial.println(date_heure);
  #endif
  Restitution_mode();
  }

    /**** boucle principale ****/

  void loop()                     // Programme en boucle
  { 
    {  
 FLUX = digitalRead(FLUX_TELEINFO);//controle la presence teleinfo
 SECTEUR = digitalRead(PSECTEUR);//controle presence secteur
  }
  if (!(DS1307isrunning()) && (reg_horloge < 7)) {      // si l'horloge n'est pas configurée
    digitalWrite(LEC_CPT1, LOW);
    if (!mem_reg_horloge) {
      switch (reg_horloge) { // debut de la structure
        case 1: Serial.println (F("Entrer Heure: "));
          break;
        case 2: Serial.println (F("Entrer Minute: "));
          break;
        case 3: Serial.println (F("Entrer Seconde: "));
          break;
        case 4: Serial.println (F("Entrer Jour: "));
          break;
        case 5: Serial.println (F("Entrer Mois: "));
          break;
        case 6: Serial.println (F("Entrer Annee 20xx: "));
          break;
      }
      mem_reg_horloge = true;
    }
    if (Serial.available() > 0) { // si caractère dans la file d'attente

      //---- lecture du nombre reçu
      while (Serial.available() > 0) { // tant que buffer pas vide pour lire d'une traite tous les caractères reçus
        inByte = Serial.read(); // renvoie le 1er octet présent dans la file attente série (-1 si aucun)
        if (((inByte > 47) && (inByte < 58)) || (inByte == 13 )) {
          ReceptionOctet = inByte - 48; // transforme valeur ASCII en valeur décimale
          if ((ReceptionOctet >= 0) && (ReceptionOctet <= 9)) ReceptionNombre = (ReceptionNombre * 10) + ReceptionOctet;
          // si valeur reçue correspond à un chiffre on calcule nombre
        }
        else presence_teleinfo = -1;
      } // fin while
      if (inByte == 13) {
        if ((ReceptionNombre > val_max[reg_horloge - 1]) || (ReceptionNombre == -1)) {
          Serial.println(F("Erreur"));
          ReceptionNombre = 0;
          mem_reg_horloge = true;
        }
        else {
          switch (reg_horloge) { // debut de la structure
            case 1: heure = ReceptionNombre;
              break;
            case 2: minute = ReceptionNombre;
              break;
            case 3: seconde = ReceptionNombre;
              break;
            case 4: jour = ReceptionNombre;
              break;
            case 5: mois = ReceptionNombre;
              break;
            case 6: annee = 2000 + ReceptionNombre;
              break;
          }

          mem_reg_horloge = false;
          ReceptionNombre = 0;
          ++reg_horloge;

          if (reg_horloge > 6) {
            RTCsetTime();
            Serial.println(F("Reglage heure OK - installer le cavalier pour la teleinfo"));
            digitalWrite(LEC_CPT1, HIGH);
            }
         }
       }
     }
   }

    else {

    RTCgetTime();

    // passage à l'heure d'été +1 heure
    // la lib RTC a une fonction: dayOfWeek qui donne le jour de la semaine (la DS1307 se charge de tout !)
    // réponse: 0 -> dimanche, 1 -> lundi etc...
    //
    if ((heure == 2) && (minute == 0) && (seconde == 0) && (dayOfWeek == 0) && (mois == 3) && (jour > 24)) {
      heure = 3;
      RTCsetTime();
    }

    // passage à l'heure d'hiver -1 heure
    if ((heure == 3) && (minute == 0) && (seconde == 0) && (dayOfWeek == 0) && (mois == 10) && (jour > 24) && (mem_chg_heure == 0)) {
      heure = 2;
      RTCsetTime();
      mem_chg_heure = 1;
    }

    if ((heure == 23) && (minute == 59) && (seconde == 40)) {// pour être sur de pas tomber pendant l'enregistrement toutes les minutes
      if ((mem_sauv_journee == 0) && (compteursluOK)) { // un seul enregistrement par jour !

        fichier_annee();
        mem_sauv_journee = 1;
        mem_chg_heure = 0;
      }
    }
    else mem_sauv_journee = 0;

    if (seconde == 1) {
      if ((mem_sauv_minute == 0) && (compteursluOK)) {// un seul enregistrement par minute !
        enregistre();
        temphyg();
        lecture6indexSurSD();
        CalculDecompteJournalier();

Bonsoir,
Sur le mega, tu à 4 port série:
Serial: TX1, RX2
Serial1: TX18, RX19
Serial2: TX16, RX17
Serial3: TX14, RX15
Par exemple, tu déclare le serial1:

Serial1.begin(1200);

et par la suite, pour la lecture de la télémesure, tu remplace 'Serial' par 'Serial1'

ça j vais compris le probleme est que l affichage des valeur doivent ce faire sur serial et que la trame teleinfo arrive sur un autre serial 1 serial 2 ou serial 3
du coup je ne trouve pas quel serial modifier dans le prog juste pour la teleinfo ..

Zarb94:
Bonsoir,
Sur le mega, tu à 4 port série:
Serial: TX1, RX0
Serial1: TX18, RX19
Serial2: TX16, RX17
Serial3: TX14, RX15
Par exemple, tu déclare le serial1:

Serial1.begin(1200);

et par la suite, pour la lecture de la télémesure, tu remplace 'Serial' par 'Serial1'

tu doit avoir un truc comme Serial.available() ici tu regarde la teleinfo
tu doit avoir un Serial.read() ici tu doit lire un char je suppose.

Donne ton code original pour voir

je viens de le mettre en pj

mega20-05-11.ino (55.7 KB)

Pascal17740:
je viens de le mettre en pj

bonsoir
comme le format teleinfo n'est pas le format par défaut , il faut aussi definir le "bon format"
pour utiliser un autre autre serial hard avec une mega

sous toutes reserve c'est du "7E1"
la déclaration doit ressembler à ça

Serial1.begin(1200,SERIAL_7E1 );

Pour la lecture de la teleinfo, regarde ces lignes: 620, 623

Artouste:
bonsoir
comme le format teleinfo n'est pas le format par défaut , il faut aussi definir le "bon format"
pour utiliser un autre autre serial hard avec une mega

sous toutes reserve c'est du "7E1"
la déclaration doit ressembler à ça

Serial1.begin(1200,SERIAL_7E1 );

tu retrouve cela sous la forme
Serial.begin(1200); UCSR0C = B00100100; et j avais essayer en modifiant comme ceci
Serial1.begin(1200); UCSR0C = B00100100;

Pascal17740:
tu retrouve cela sous la forme
Serial.begin(1200); UCSR0C = B00100100;

oui, mais çà c'et seulement pour le serial hard du uno , non ?
sans jouer avec avec les registres du mega , la definition est peut etre plus simple directement par un "serial begin"

Artouste:
oui, mais çà c'et seulement pour le serial hard du uno , non ?
sans jouer avec avec les registres du mega , la definition est peut etre plus simple directement par un "serial begin"

Je viens de suivre ton conseil a priori j ai bien ma trame qui est traite sauf que sur ma page web il sort des caracteres speciaux a la place des é

Regardez quel codage de caractère est utilisée par votre teleinfo. Que recevez vous pour un é ?

Il faut peut être changer cela à la volée dans la page web pour la représentation normée &eacute;

Par exemple pour afficher C’est la fin de l’été correctement de manière générique il faudrait écrire<p>C'est là fin de l’&eacute;t&eacute;</p>le HTML à l’origine ayant été prévu pour du code ASCII 7 bits, tous les caractères compliqués ont une séquence de représentation

Si votre info reçu est en UTF-8:

De nos jours L'UTF-8 est compris par tous les navigateurs courrants. Il permet d'encoder un nombre gigantesque de caractères (plus de 4 milliards !).

En utilisant l'UTF-8 dans une page, on n’a plus besoin de la conversion des caractères spéciaux en code HTML. Un e avec un accent aigu peut donc être écrit directement é et non &eacute; dans votre code source (si le codage du fichier lui même est UTF-8)

Pour que le navigateur sache à quoi s’attendre il faut dire que votre pages est en UTF-8, il faut donc préciser dans l'entête de votre page l'encodage choisi grâce à une balise Meta -> ajoutez le code suivant entre les balises et :

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

J-M-L:
Regardez quel codage de caractère est utilisée par votre teleinfo. Que recevez vous pour un é ?

Il faut peut être changer cela à la volée dans la page web pour la représentation normée &eacute;

Par exemple pour afficher C’est la fin de l’été correctement de manière générique il faudrait écrire<p>C'est là fin de l’&eacute;t&eacute;</p>le HTML à l’origine ayant été prévu pour du code ASCII 7 bits, tous les caractères compliqués ont une séquence de représentation

Si votre info reçu est en UTF-8:

De nos jours L'UTF-8 est compris par tous les navigateurs courrants. Il permet d'encoder un nombre gigantesque de caractères (plus de 4 milliards !).

En utilisant l'UTF-8 dans une page, on n’a plus besoin de la conversion des caractères spéciaux en code HTML. Un e avec un accent aigu peut donc être écrit directement é et non &eacute; dans votre code source (si le codage du fichier lui même est UTF-8)

Pour que le navigateur sache à quoi s’attendre il faut dire que votre pages est en UTF-8, il faut donc préciser dans l'entête de votre page l'encodage choisi grâce à une balise Meta -> ajoutez le code suivant entre les balises et :

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

sauf que si la page web est écrite dans le hard il ne veut pas de client.print("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />");
je n avais pas ce problème quand les trames de teleinfo etaient reçues sur serial

sauf que si la page web est écrite dans le hard il ne veut pas de

client.print("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />");

je n avais pas ce problème quand les trames de teleinfo etaient reçues sur serial

Qui ne veut pas? Et où mettez vous cette info?

Quel code recevez vous pour un é?

Que les trames arrivent sur un port série ou un autre cela ne change rien au programme. L'erreur doit être ailleurs.
D'ailleurs, dans l'exemple que tu cites:

client.print("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />");

Le problème vient du fait que tu n’échappes pas les guillemets à l'intérieur de la chaîne de caractères et du coup ton code est incohérent.

client.print("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");