J'ai besoin d'explication sur une erreur QUELLE ERREUR?

voici l'erreur et je ne comprend pas :

Compilation error: the value of 'initialization' is not usable in a constant expression

et voici le code associé

#define txPin 1
#define rxPin 0
const byte NUL = 0x00;
const byte STX = 0x02;  // début du texte
const byte ETX = 0x03;  // fin du texte
const byte EOT = 0x04;  // fin de la transmission
const byte ENQ = 0x05;  // enquiry
const byte ACK = 0x06;  // Acknowledge
const byte NAK = 0x15;  // Negative Acknowledge

byte RESPONSE = 0;

//===========================================================//
//                                                           //
//                                                           //
//                         Horloge                           //
//                                                           //
//                                                           //
//===========================================================//

const unsigned long TSec = 1000;
unsigned long Num_ms, Num_sec, Num_min;
unsigned long Num_heur, Num_jour, Temps_ms;

void setup() {
  Serial.begin(1200, SERIAL_7E1);
}

void loop() {
  int etat_protocol = 0;
  int initialization = 0;
  int configuration = 1;
  
  switch (etat_protocol) {
    case initialization :
      // ************************************** //
      //                 Etape 1                // initialization
      // ************************************** //

      Serial.write(ENQ);
      delay(150);

      while (Serial.available() > 0) {
        RESPONSE = Serial.read();
      }

      if (RESPONSE == ACK) {
        // ------------------- //
        //   Envoie de STX     //
        // ------------------- //
        Serial.write(STX);
        
        // ------------------- //
        //  Affichage OK       //
        // ------------------- //
        Serial.write("@K");   // Envoie "K" pour le paramètre Initialization

        // ------------------- //
        // Affichage version   //
        // ------------------- //
        Serial.write("01000");    // Indique la version

        // ------------------- //
        //  Affichage date     //
        // ------------------- //
        Serial.write("20230607"); // Si date besoin de mettre à jour remplacer sous la forme suivante "20230607" tout collé

        // ------------------- //
        //  Affichage heure    //
        // ------------------- //
        Temps_ms = millis();
        Num_sec = (Temps_ms / TSec) % 60;             // Calcul seconde
        Num_min = (Temps_ms / (TSec * 60)) % 60;      // Calcul minute
        Num_heur = (Temps_ms / (TSec * 3600)) % 60;   // Calcul heure
        Num_jour = (Temps_ms / (TSec * 86400));       // 3600 * 24 = 86400

        Serial.print(Num_jour); // Écrit le jour
        Serial.print(Num_heur); // Écrit l'heure
        Serial.print(Num_min);  // Écrit les minutes
        Serial.print(Num_sec);  // Écrit les secondes

        // ------------------- //
        //  FIN DE TRAME       //
        // ------------------- //
        Serial.write(ETX);
      }
      break;

    case configuration:
      // ************************************** //
      //                 Etape 2                // configuration
      // ************************************** //
      Serial.write(ENQ);
      delay(150);

      while (Serial.available() > 0) {
        RESPONSE = Serial.read();
      }

      if (RESPONSE == ACK) {
        Serial.write(STX);  // Envoie STX
        Serial.write("@C"); // Envoie le "C" pour le paramètre configuration
        Serial.write(ETX);
        Serial.write(NUL);
      }
      break;
  }
}

Il ne manque pas une partie du message, comme le numéro de ligne de l'erreur ?

On ne peut pas utiliser une variable dans cette expression.
case attend une constante comme paramètre.

Et tu dois avoir la même erreur pour le second case

Yes ducoup je lest mise dans un enum mais le int etat_protocol(ligne 30) n'est pas accepté non plus :xd

Cela devrait marcher, mets ton code modifié

#define txPin 1
#define rxPin 0
const byte NUL = 0x00;
const byte STX = 0x02;  // début du texte
const byte ETX = 0x03;  // fin du texte
const byte EOT = 0x04;  // fin de la transmission
const byte ENQ = 0x05;  // enquiry
const byte ACK = 0x06;  // Acknowledge
const byte NAK = 0x15;  // Negative Acknowledge

byte RESPONSE = 0;

//===========================================================//
//                                                           //
//                                                           //
//                         Horloge                           //
//                                                           //
//                                                           //
//===========================================================//

const unsigned long TSec = 1000;
unsigned long Num_ms, Num_sec, Num_min;
unsigned long Num_heur, Num_jour, Temps_ms;

enum Etat_protocol { initialization, configuration }; // 

void setup() {
  Serial.begin(1200, SERIAL_7E1);
}

void loop() {
  Etat_protocol etat_protocol = initialization; // Initialisation de l'état du protocole

  switch (etat_protocol) {
    case initialization:
      // ************************************** //
      //                 Etape 1                // initialization
      // ************************************** //

      Serial.write(ENQ);
      delay(150);

      while (Serial.available() > 0) {
        RESPONSE = Serial.read();
      }

      if (RESPONSE == ACK) {
        // ------------------- //
        //   Envoie de STX     //
        // ------------------- //
        Serial.write(STX);

        // ------------------- //
        //  Affichage OK       //
        // ------------------- //
        Serial.write("@K");   // Envoie "K" pour le paramètre Initialization

        // ------------------- //
        // Affichage version   //
        // ------------------- //
        Serial.write("01000");    // Indique la version

        // ------------------- //
        //  Affichage date     //
        // ------------------- //
        Serial.write("20230607"); // Si date besoin de mettre à jour remplacer sous la forme suivante "20230607" tout collé

        // ------------------- //
        //  Affichage heure    //
        // ------------------- //
        Temps_ms = millis();
        Num_sec = (Temps_ms / TSec) % 60;             // Calcul seconde
        Num_min = (Temps_ms / (TSec * 60)) % 60;      // Calcul minute
        Num_heur = (Temps_ms / (TSec * 3600)) % 60;   // Calcul heure
        Num_jour = (Temps_ms / (TSec * 86400));       // 3600 * 24 = 86400

        Serial.print(Num_jour); // Écrit le jour
        Serial.print(Num_heur); // Écrit l'heure
        Serial.print(Num_min);  // Écrit les minutes
        Serial.print(Num_sec);  // Écrit les secondes

        // ------------------- //
        //  FIN DE TRAME       //
        // ------------------- //
        Serial.write(ETX);
      }
      break;

    //-----------------------------------------------------------------------------//
    case configuration:
      // ************************************** //
      //                 Etape 2                // configuration
      // ************************************** //
      Serial.write(ENQ);
      delay(150);

      while (Serial.available() > 0) {
        RESPONSE = Serial.read();
      }

      if (RESPONSE == ACK) {
        Serial.write(STX);  // Envoie STX
        Serial.write("@C"); // Envoie le "C" pour le paramètre configuration
        Serial.write(ETX);
        Serial.write(NUL);
      }
      break;
  }
}

Je compile ce code sans erreur

tu es sûre, il n'y a rien en ligne 30 ?

moi aussi mais après quand je regarde a l'oscillo le travail est bien tordu mes trames partent dans tout les sens

Tu dis

Qu'est-ce qui te fait dire ça?

Faites attention au fait suivant:
l'état (etat_protocol) est local à loop et, par exemple, vous ne passerez jamais dans l'etat "configuration" (la sortie de loop puis le réappel vous remetrra systematiquement à
etat_protocol == 0;

Si ce n'est pas ce que vous voulez, vous avez deux options
a) mettre etat_protocol en variable globale (considéré comme vilain par certains); peut être le faire gérer aussi par setup()

b) transformer

int etat_protocol = 0;

en


static int etat_protocol = 0; // attention: sur un 8 bits maigrichon, vous feriez mieux de faire un byte/int8_t .... (les tests doivent être un peu plus rapides)

etat_protocol pourra alors prendre deux valeurs , init et config (et vous n'aurez pas de code dormant, si je vous ai bien lu : vous ne passez jamais dans l'état "config")

C'est peut-être dû au fait que tu fais parfois un Serial.write et d'autres fois un Serial.print. Le print transforme ta donnée en ASCII avant de l'envoyer. Le write envoie des bytes ou des arrays de bytes.

j'ai essayé les serial.write à la place des print mais cela ne marche pas

que fait

Cela envoie une demande a mon module pour savoir s'il est pret a recevoir une trame ensuite j'attend une réponse et une fois que j'ai la réponse ACK je lui envoie la trame

Comme on ne connaît pas le protocole difficile de dire s’il faut envoyer en binaire ou en ASCII…

à 1200 bauds le buffer de sortie peut saturer assez vite et un print peut devenir bloquant.

Attention à l’usage de delay et du port série. On peut vite perdre des données si le buffer d’entrée sature.

Le port série est asynchrone, essayer de faire un code synchrone est source d’ennuis généralement

Sinon +1 sur le souci de l’évolution de la variable servant au case mentionné par @coloneldeguerlasse

il s'agit d'un protocol inventé par mon entreprise, la vitesse de transmission du module est bien de 1200 baud j'ai essayer avec le print mais le résultat obtenu n'est pas celui que j'attend car par exemple pour l'heure que je dois afficher a la case heure elle s'affiche en format 0-0-0-0 au lieu de 00-00-00-00 et je ne sais pas comment faire a partir du code de l'horloge que jai ecrit

Enfaite je dois refaire le protocol

Eh bien, ce n'est pas beau
Je vais vous proposer une solution laide
vous souhaitez afficher, me semble-t-il (déduit de votre code) jour, heure, minute, seconde
JE vais supposer que vous avez 4 variables entières , positives et inférieures à 255 (60, en fait)
numJour, numHeure, numMinute, numSeconde
la chaine receptrice sera JJ-HH-MN-SS aura pour longueur 12 (oui: finit par \0)
Le bout de code suivant

uint8_t numJour, numHeure, numMinute, numSeconde;
char buffer[]  = "JJ-HH-MN-SS"; // dimensionne proprement buffer par initialisation
numJour = 28;
numHeure = 5; // vous avez l'air malheureux avec les int < 10
numMinute = 44;
numSeconde = 1;
snprintf(buffer, sizeof(buffer), "%02d-%02d-%02d-%02d", numJour, numHeure, numMinute, numSeconde);
//   /* test sur pc */ printf("<%s>\n", buffer);
Serial.print(buffer); // sur Arduino

a quelques chances de marcher ... une fois que vous aurez trouvé un moyen de connaître le jour ... les secondes sur l'Arduino -ce qui est loin d'être trivial, mais vous devriez avancer par petits bouts-
En tous cas, sur mon pc, il donne (après insertion)

./a.out
<28-05-44-01>

Nota: vous devriez sérieusement commenter votre code; on veut bien vous aider (un protocole est plus compliqué qu'un formattage en c (même pas ++) ; si on ne comprend pas , il va y avoir un stade où on introduira plus de confusion que la question initiale).

Déjà, vous avez au moins 3 problèmes:

  • avoir un protocole de transmission qui marche (le sujet). Il faudrait le décrire plus en détail, soit dans le code (commentaires), soit dans le fil (on doit ramasser des infos bizarroîdes, en ordre dispersé)

  • avoir un Arduino à l'heure (me semble-t-il) Il y a 55555 solutions au moins; faites en un fil de discussion à part edité si ce n'est déjà fait, pour le salut de nos âmes.

(la solution optimale est à mon avis le ds3231; le forum a un moteur de recherche -google aussi-; il vous suffit d'en acheter un, de lui mettre une pile (c'est le point le plus affreux)et de comprendre puis adapter les exemples donnés dans l'IDE Arduino; le mien dure depuis deux ans, sans que la pile ne s'épuise.

  • transmettre l'heure à un joli format (je pense l'avoir résolu, au moins en partie; personne ne trouvera la solution -quasi triviale en C- avec le moteur de recherche de ce forum, c'est hors sujet, mais emnnuyeux si on débute)...

Tu est sûr que tu affiche l'heure au format 0-0-0-0 car je ne vois pas d'affichage de ce type dans ton code.
je vois plutôt un envois de 0000 et rien qui affiche.
De même de quel case heure parles-tu ?

par contre tu envois l'heure sans compléter les nombres à 0.
le format que tu veux envoyer n'est pas plutôt HHMMSS ?