[Resolu] Affichage dans la liaison série d'une variable texte

Bonjour,

Pour un projet, j'ai besoin d'un affichage dans la liaison série d'une variable texte contenue dans un tableau de valeur.

Pour être plus précis, en temps normal les badges RFID sont sur des tableaux de 5 valeurs, et j'aimerai en rajouter une avec le nom de la personne a laquelle appartient le badge pour afficher dans la liaison série "Un tel a ouvert la porte"

J'ai donc réalisé le code suivant afin de tester hors du programme :

char lettre[6] = {'a', 'b' , 'c' , 'd' , 'e', 'f'};
char phrase ="La lettre suivante est : ";
int i = 0;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
for (i=1; 6; i++) {
    Serial.print(phrase);
    Serial.println(lettre[i]);
    delay(1000);
                  }
            }

Les lettres s'affichent bien, par contre la phrase ne s'affichent pas.

De plus, ici le tableau entier est composé de lettre, mais dans le cas d'un ID RFID le reste des valeurs sont des nombres, et même en declarant mon badge en tant que par exemple,

char badge[6} = { 1, 2, 3, 4, 5, 'C');

L'afficheur série ne me retourne pas le C avec un Serial.print(badge[6])

Voila donc mes 2 questions :

Comment afficher plus d'un caractère dans la liaison série

Et comment reussir a afficher mon C, puis plus tard une chaine de caractère, lorsque celle ci est une des variables du tableau correspondant a mon badge.

Merci à vous !

les tableaux commencent à l'indice 0, pas 1 et une boucle for ne s'écrit pas comme cela (si vous voulez qu'elle s'arrête)for (i=1; 6; i++) {

les badges RFID ont un identifiant numérique sur 4 à 10 octets. il faudra décider comment vous voulez les afficher (décimal, binaire, hexadécimal avec ou sans point entre les octets, ....)

Merci de votre réponse.

En effet, j'avais oublié ce details, maintenant dans le programme avec le RFID cela affiche bien la lettre souhaitée.

De plus pour la boucle for, j'ai refais un programme a la va vite pour expliquer mon problème le plus rapidement possible sans devoir poster tout le code, en effet j'ai mal écris la condition je l'ai réecrite de cette forme :

for (i=0; i<=5; i++)

Par contre, le problème pour afficher une phrase ou du moins plusieurs caractères reste le même.

doser13:
Par contre, le problème pour afficher une phrase ou du moins plusieurs caractères reste le même.

ça aide ?

const char unePhrase[] = "coucou il fait beau";
const char * uneAutrePhrase = "Damned il pleut";

const byte desOctets[] = {10, 20, 30, 40};
const byte nombreElementsDuTableau = sizeof(desOctets) / sizeof(desOctets[0]);

void setup()
{
  Serial.begin(115200);
  Serial.println(unePhrase); // ça marche directement pour une cString
  Serial.println(uneAutrePhrase); // ça marche directement pour une cString
  Serial.println(); // on rajoute un passage à la ligne

  // si vous voulez une itération par caractère
  for (byte i = 0; unePhrase[i] != '\0'; i++) // une cString se termine par un caractère nul
    Serial.print(unePhrase[i]);
  Serial.println(); // on rajoute un passage à la ligne

  // pour un tableau de chiffres
  for (byte i = 0; i < nombreElementsDuTableau; i++) {
    Serial.print(desOctets[i]);
    if (i != nombreElementsDuTableau - 1) Serial.write('.');
  }
  Serial.println(); // on rajoute un passage à la ligne

  // ou en hexadécimal
  for (byte i = 0; i < nombreElementsDuTableau; i++) {
    Serial.print(desOctets[i], HEX);
    if (i != nombreElementsDuTableau - 1) Serial.write('.');
  }
  Serial.println(); // on rajoute un passage à la ligne

}

void loop() {}

(mettez la console à 115200 bauds, pas la peine de se trainer à 9600 bauds)

En effet ça m'a bien aider, mon erreur était de ne pas avoir mis les [] pour après le nom. D'ailleurs, dans ce cas la on est d'accord que ces [] servent à créer un tableau avec les caractères qui seront définis ensuite ?

Je sais que par exemple dans le cas du RFID si on appelle un badge badge[5] ca veut dire que la variable badge est définie par 5 valeurs, mais dans le cas d'une chaine de caractère comme ici je ne suis pas sur

En revanche, je me rend compte maintenant que dans mon cas, qui est le suivant je défini mon badge RFID comme ceci :

const char Nom_badge[] = "Charles";
char badge[6]={25, 167, 195, 177, 204, Nom_badge[]};

Mais en essayant de compiler, j'ai l'erreur " expected primary-expression before ']' token "

J'avoue que la je ne sais pas trop, j'ai essayé si je met dans les [] par exemple 3, ca me renvoi le caractère en 3ème position dans la constante Nom_badge (ici un a), mais pas moyen de lui faire imprimer tous les caractères.

doser13:
En effet ça m'a bien aider, mon erreur était de ne pas avoir mis les [] pour après le nom. D'ailleurs, dans ce cas la on est d'accord que ces [] servent à créer un tableau avec les caractères qui seront définis ensuite ?

quand on initialise un tableau de caractères avec une constante de type chaîne de caractère ( du texte entre guillemets, qu'on appelle cString) le compilateur réserve assez de place pour chacun des caractères (qu'il copie dans la mémoire) plus un caractère en plus à la fin qui sera initialisé avec le caractère nul ('\0'). C'est ce caractère nul qui marque la fin de la chaîne en mémoire. Le nom du tableau est une variable de type pointeur sur caractère et est à l'adresse du premier caractère stocké.
Comme on initialise le tableau avec du contenu, on n'a pas besoin de dire la taille au compilateur, il va automatiquement la choisir pour que tout tienne y compris le caractère nul de fin (et pas plus).

(si on définit avec const char *ça fait plus ou moins la même chose, on a un pointeur vers une zone mémoire où sont rangés les caractères avec un caractère nul à la fin)

Je sais que par exemple dans le cas du RFID si on appelle un badge badge[5] ca veut dire que la variable badge est définie par 5 valeurs, mais dans le cas d'une chaine de caractère comme ici je ne suis pas sur

le nom n'importe peu, ce qui compte c'est le type de votre variable badge. quand on écrit unType badge[5];on réserve en mémoire 5 places de type 'unType'.

Quand vous faiteschar badge[6]={25, 167, 195, 177, 204, Nom_badge[]};vous dites au compilateur que badge est un tableau de 6 caractères. les 5 premiers machins que vous mettez dedans ne sont même pas des caractères et le dernier c'est un truc qui ne veut rien dire et n'est pas du type char...

Nom_badge serait du type char* (pointeur sur caractère)
Nom_badge[] ça ne veut rien dire
Nom_badge[0] ça serait un caractère, le premier du tableau (le 'C' de "Charles")

Ce que vous voulez faire ne se fait pas avec un tableau mais avec une structure, mot clé struct. ça permet de créer un type qui va grouper ensemble des données de différents types. Ici vous pourriez avoir

struct t_badge {
  const byte identifiant[5];
  const char * utilisateur;
};

avec ça vous créez un nouveau type t_badge qui combine un tableau de 4 octets et un pointeur vers des caractères.

ensuite vous pouvez initialiser une variable de type t_badge comme cela

 t_badge unBadge = {
{25, 167, 195, 177, 204}, // ça remplit le tableau 'identifiant[5]'
"Charles" // ça initialise le pointeur 'utilisateur' vers cette chaîne
};

On s'en servirait comme cela dans un petit code:

struct t_badge {
  const byte identifiant[5];
  const char * utilisateur;
};

t_badge unBadge = {
  {25, 167, 195, 177, 204},
  "Charles"
};

void setup()
{
  Serial.begin(115200);
  Serial.print("Badge de ");
  Serial.println(unBadge.utilisateur);
  Serial.print("N° de série: ");
  for (byte i = 0; i < 5; i++) {
    Serial.print(unBadge.identifiant[i]);
    Serial.print(".");
  }
}

void loop() {}

le moniteur série (à 115200 bauds) affichera

[color=purple]
Badge de Charles
N° de série: 25.167.195.177.204.
[/color]

==> prenez un peu de temps pour lire un tuto sur le langage C. vous avez des lacunes qui vous rendent la vie plus difficile que nécessaire

Cela ressemble assez à une liste chainée non ? Il me semble qu'une liste chainée est une structure particulière, j'avais vu un tuto là dessus , mais le tuto était en C et non pas vraiment en langage arduino (même si je sais que celui-ci est assez ressemblant) et je ne savais pas si il était transposable.

Je n'avais jamais entendu parler de structure dans arduino, je vais me pencher sur la question car ça me semble être la solution à pas mal de problématique rencontrée dans mon projet.

Merci pour vos explications ! :slight_smile:

doser13:
Cela ressemble assez à une liste chainée non ? Il me semble qu'une liste chainée est une structure particulière, j'avais vu un tuto là dessus , mais le tuto était en C et non pas vraiment en langage arduino (même si je sais que celui-ci est assez ressemblant) et je ne savais pas si il était transposable.

Non ce n'est pas une liste chaînée... il n'y a pas de pointeurs vers un élément suivant ou précédent. c'est vraiment juste une structure... un concept à part entière du langage C ou C++..

Tenez, lisez cela pour vous rafraichir la mémoire :slight_smile:

il n'y a pas non plus de "langage Arduino", c'est du C++... (donc ce que vous connaissez du C s'applique aussi).
(Arduino fournit un IDE et des bibliothèques de fonctions / classes, le compilateur est standard)

J-M-L:
==> prenez un peu de temps pour lire un tuto sur le langage C. vous avez des lacunes qui vous rendent la vie plus difficile que nécessaire

Contrairement à J-M-L, pédagogue infatigable, j'ai tendance à penser que le forum ne sert pas à apprendre le langage C.
Le langage C est extrêmement répandu, on trouve pléthore de documentations et de tutoriels.
Le forum peut aider sur des cas complexes, mais les bases du langage sont un peu un prérequis.
Vous avez le droit de ne pas être d'accord !

J’étais dans un bon jour :slight_smile:

Je suis d'accord avec vous sauf que la comunication de la société Arduino tend à faire croire à l'existence d'un langage arduino.
De même que les déclarations comme "avec arduino vous ne vous rendrez pas compte que vous manipulez un microcontrôleur ", comme Banzi i'a déclaré à l'occasion de la sortie d'une nouvelle carte, sont dévastatrices. On en voit les conséquences avec les interconnexions entre circuits 5V et 3,3V.
Les débutants font confiance de bonne foi et sont abusés par cette propagande commerciale.

Et bien non la réalité n'est pas aussi idilique, il faut apprendre le C,C++ et acquérir les rudiments de l'électronique.

Et bien non la réalité n'est pas aussi idilique, il faut apprendre le C,C++ et acquérir les rudiments de l'électronique.

oui ! disons que c'était relativement vrai au début quand il avait juste un UNO et des simples "shield" qui se branchaient dessus et ne nécessitaient pas d'alimentation séparée

Merci pour toutes vos réponses, je pense que avant d'avancer dans ce projet je vais prendre quelques leçons de C parce que je ne bloque pas sur des petits détails mais j'ai tout simplement pas les outils.

Juste une question avant de vous laissez tranquille :slight_smile:

En utilisant le programme de J-M-L suivant :

struct t_badge {
  const byte identifiant[5];
  const char * utilisateur;
};

t_badge unBadge = {
  {25, 167, 195, 177, 204},
  "Charles"
};

void setup()
{
  Serial.begin(115200);
  Serial.print("Badge de ");
  Serial.println(unBadge.utilisateur);
  Serial.print("N° de série: ");
  for (byte i = 0; i < 5; i++) {
    Serial.print(unBadge.identifiant[i]);
    Serial.print(".");
  }
}

J'ai le message d'erreur "Erreur de compilation pour la carte arduino uno" lorsque je compile.

Je me tourne vers vous car cela ne ressemble en rien a des problemes que j'ai déjà rencontré.

Bien sur, la carte est branchée et le téléversement d'autres programmes fonctionne correctement.

Et sinon pour vous répondre, oui je suis débutant en arduino et j'avais souvent entendu que le langage utilisé en arduino était tiré du C mais était différent... Apparement non et tant mieux, car en effet il y a beaucoup de tuto pour apprendre le C ça va beaucoup m'aider :slight_smile:

EDIT : Problème résolu, je cherche le problème depuis 1h sur des forums, j'avais juste besoin de rajouter un void loop, pas de problème du coup :wink:

le compilateur devait vous le dire si vous regardez dans la console les messages d'erreur

[color=orange]
.../cores/arduino/main.cpp:46: [b][color=red]undefined reference to `loop'[/color][/b]
collect2: error: ld returned 1 exit status
exit status 1
Erreur de compilation pour la carte Arduino Uno
[/color]

et il y avait bien un void loop() {}dans mon code ci dessus :slight_smile:

Après quelque bricolage et du temps pour apprendre un peu mieux la notion de structure, la solution que tu m'as donné fait exactement ce dont j'avais besoin, merci beaucoup pour les explications détaillées !

Je vais maintenant m'entrainer sur les listes chainées, solutions de mon prochain problème :smiley:

Encore merci !