Bonjour, le titre n'est pas très explicite mais j'aimerais faire ceci; je dispose d'une chaine de caractère comprenant 12 éléments, et je souhaite stocker 10 d'entre eux dans une variable et j'ai beau avoir cherché, je n'ai pas trouvé de réponse
Voici le programme en question :
void loop () {
for (int x = 0; x < 12; x++){
if( SoftSerial.available() > 0 )
{
u++;
val[u] = SoftSerial.read();
Serial.write( val[u] );
}
}
}
Dans ton code ce n'est pas une chaîne de caractères mais une lecture sur un port série logiciel (SoftSerial) pour les envoyer sur le port serie standard (Serial).
Tenant compte de ta description, je suppose qu'il manque juste un if pour n'écrire que les 10 premiers caractères ? un truc de ce genre là :
void loop () {
u=0; // reinitialisation de u, sinon tu n'y passes qu'une fois
for (int x = 0; x < 12; x++)
{
if( SoftSerial.available() > 0 )
{
u++;
if ( u < 10 ) // pour ne prendre que les 10 premiers caractères
{
val[u] = SoftSerial.read();
Serial.write( val[u] );
}
}
}
}
Zorro_X:
Dans ton code ce n'est pas une chaîne de caractères mais une lecture sur un port série logiciel (SoftSerial) pour les envoyer sur le port serie standard (Serial).
Tenant compte de ta description, je suppose qu'il manque juste un if pour n'écrire que les 10 premiers caractères ? un truc de ce genre là :
void loop () {
u=0; // reinitialisation de u, sinon tu n'y passes qu'une fois
for (int x = 0; x < 12; x++)
{
if( SoftSerial.available() > 0 )
{
u++;
if ( u < 10 ) // pour ne prendre que les 10 premiers caractères
{
val[u] = SoftSerial.read();
Serial.write( val[u] );
}
}
}
}
Re,
enfait, peut-être que je me trompe, mais justement, la lecture que je fais sur mon lecteur RFID (c'est le module sur lequel je travaille), stocke les valeurs du tag RFID dans une chaîne de caractère. Pour ici, la valeur de mon tag est 8600012216B3, ma chaine de caractère contient donc 8 au premier emplacement de la chaîne, 6 au second etc...
Et concrètement ma question c'est comment récupérer ce code (donc 8600012216B3 ici), dans une seule variable que je puisse manipuler par la suite dans mon programme.
Ailiganon:
Et concrètement ma question c'est comment récupérer ce code (donc 8600012216B3 ici), dans une seule variable que je puisse manipuler par la suite dans mon programme.
Je suppose que c'est dans ta variable "val" que tu souhaites le stocker...
Tu faisais déjà comme il faut alors... je ne vois pas où est le problème ?
bien sur, il faut qu'au préalable t'aies déclaré val de la sorte :
void loop ()
{
char val[13]; // tailel 13 car il te faut stocker les 12 caractères de ta chaîne plus le caractère '\0' de fin de chaîne
int u=0; // (re)initialisation de u, sinon tu n'y passes qu'une fois
for (int x = 0; x < 12; x++)
{
if( SoftSerial.available() > 0 )
{
val[u] = SoftSerial.read();
Serial.write( val[u] );
u++; // on fait ca à la fin, sinon t'écriras jamais à la place [0] de ton tableau
}
}
val[12] = '\0'; // très important de mettre la fin de chaîne sinon ca risque de faire des plantages pas beaux...
}
Attention : la fin de chaîne est très importante et absolument nécessaire si tu veux pouvoir utiliser val comme une chaîne de caractères...
for (int x = 0; x < 12; x++){
if( SoftSerial.available() > 0 )
{
Tu fais 12 tours de boucle
mais si SoftSerial.available() est inférieur ou égal à 0 (ce qui arrive si aucune donnée n'est arrivée via le port série), tu ne fais rien
Autrement dit tu n'est pas sur de récupérer ne serait-ce qu'un seul octet.
Vu la vitesse de traitement de ta boucle, elle risque tourner plus vite que le temps nécessaire à la transmission d'un octet
Bien vu Alain46 !
Je corrige mon code d'exemple en conséquence :
int u=0; // (re)initialisation de u, sinon tu n'y passes qu'une fois
char val[13]; // tailel 13 car il te faut stocker les 12 caractères de ta chaîne plus le caractère '\0' de fin de chaîne
void loop ()
{
if( SoftSerial.available() > 0 )
{
val[u] = SoftSerial.read();
Serial.write( val[u] );
u++; // on fait ca à la fin, sinon t'écriras jamais à la place [0] de ton tableau
}
// si la chaine a été remplie (12 caractères lus)
if ( u >= 12 )
{
val[12] = '\0'; // très important de mettre la fin de chaîne sinon ca risque de faire des plantages pas beaux...
// réinitialisation de u pour pouvoir recommencer :
u = 0;
// c'est ICI que tu peux utiliser val[] comme une chaine de caractères pour tes traitements
}
}
Après, c'est sur que ce code ne rime à rien tant qu'on ne sait pas ce que tu veux en faire, parce-que lire une chaîne depuis un lien série c'est bien joli, mais des façons de faire plus optimisées et pratiques il y en a plein d'autres...
En fait mon programme me sert à dire quels tags sont autorisés et lesquels ne le sont pas. Donc si la valeur du tag ne correspond à une valeur que l'on a définie auparavant celui-ci sera refusé.
Enfait c'était pour cela que je voulais stocker cela dans une variable, car cela serait facile pour moi de simplement comparer 2 variables.
Mais d'après ce que vous me dites, on pourrait apparemment utiliser la chaîne de caractère "val" comme une variable normale.
Donc si je suis votre logique, val = 8600012216B3 ?
non non, val est une chaîne de caractères, un tableau qui contient une suite de "codes" (ASCII) représentant des lettres et/ou des chiffres, voire des symboles (parenthèse, signes, etc...)... une affectation "directe" comme celle que t'en aurais "déduit" ne fonctionne pas du tout (regarde mon code d'exemple).
En utilisant la classe String tu peux faire quelque chose du genre :
String maChaine;
maChaine = "8600012216B3";
Mais ca ne va pas te permettre de mieux lire tes données en provenance d'un lien série (!)
Au vu de ton niveau, tu devrais commencer par lire un tuto, comme celui-ci pour comprendre un peu mieux ce dont il s'agit...