Go Down

Topic: Port série dans un tableau Array (Read 1 time) previous topic - next topic

philippe57

Dec 28, 2013, 10:47 pm Last Edit: Dec 28, 2013, 10:49 pm by philippe57 Reason: 1
bonsoir a tous

je suis sur un projet de train DCC format N
je cherche à récupéré la valeur d'un RFID dur port série dans un arduino NANO (port 0;1)
pour la lecture du port série pas de problème voici mon code :

Code: [Select]

char inData[64];
char inChar=-1;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
    byte numBytesAvailable= Serial.available();

    // if there is something to read
    if (numBytesAvailable > 0){
        // store everything into "inData"
        int i;
        for (i=0;i<numBytesAvailable;i++){
            inChar= Serial.read();
            inData[i] = inChar;
        }

        inData[i] = '\0';


        Serial.print("Arduino Received: ");
        Serial.println(inData);
    }




maintenant je voudrais recupéré la valeur : inData
dans un tableau Array : num_train[0] = inData;

la variable num_train est declaré comme ca :  char* num_train[3];

apres quand je lis les valeurs du tableau avec cette methode :
Code: [Select]

  Serial.print('pos 1 :');
  Serial.print(num_train[0]);
  Serial.print('|');
  Serial.print('pos 2 :');
  Serial.print(num_train[1]);
  Serial.print('|');
  Serial.print('pos 3 :');
  Serial.print(num_train[2]);
  Serial.print('|');
  Serial.print('pos 4 :');
  Serial.println(String(num_train[3]));


la valeur retourne me donne ca : 8250|8250|8250|8250
alors quand il me retourne la valeur direct dans le serial :
Code: [Select]

Serial.print("Arduino Received: ");
Serial.println(inData);

Pas de problème

Merci de votre aide

Cordialement Philippe

fdufnews

Ce que tu constates est normal.
Le tableau numtrain contient des pointeurs sur des tableaux de char.
A chaque fois tu fais l'affectation
Code: [Select]
numtrain[x] = inData qui ne transfère pas de données puisque l'opération ne met en oeuvre que des pointeurs. Donc chaque élément de numtrain pointe sur inData. Le contenu de inData change à chaque réception de données donc tu relis la dernière valeur acquise.
Si tu veux conserver la valeur unique pour chaque train, il faut que numtrain soit un tableau de chaines de caractères. Il faudrait donc le définir ainsi:
Code: [Select]
char numtrain[3][64]

Et les affectations de valeurs de inData vers numtrain doivent se faire par strcpy ou strncpy
Code: [Select]
strncpy(numtrain[i], inData,64)

philippe57

Bonjour,

Merci pour ta réponse
Apres test je m'aperçois que la variable passe bien mais le problème c'est dans mon code de debug sur le port serie
il m'affiche toujours 8250 puis pares la valeur que je rentre dans un serial.read()
exemple :
je rentre la valeur 123 il va me marque 8250123
même si je met une variable type string : Serial.print(String (rfid));
et même si je met la variable inData : Serial.print(inData);
alors que la ligne :
Code: [Select]

        Serial.print("Arduino Received: ");
        Serial.println(inData);


passe très bien sans problème d'affichage.
donc si quelqu'un a une solution ? merci davance

philippe57

re bonjour,

j'ai trouvé pourquoi : j'avais trop de donnee sur le port serie sur la meme ligne donc j'ai fait un tableau :

Code: [Select]

-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
|   Capteur Feux 1 : 0  |  Capteur Feux 2 : 0  |  Capteur Feux 3 : 0  |  Capteur Feux 4 : 0 |  Scènes : 0       |
-----------------------------------------------------------------------------------------------------------------
|  Train au niveau  1 :0000000| Train au niveau 2 :0000000| Train au niveau 3 :0000000| Train au niveau 4 :0000000  |
-----------------------------------------------------------------------------------------------------------------
| Etat du Feux 1 :  Vert | Etat du Feux 2 :  Vert | Etat du Feux 3 :  Vert | Etat du Feux 4 :  Vert | Tempo : 0 |
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------




maintenant je cherche a faire une sorte de CLS dans le terminal  a la fin du tableau ou au debut

quelqu'un a une solution ?

Merci

philippe57

#4
Dec 29, 2013, 05:16 pm Last Edit: Dec 29, 2013, 07:04 pm by philippe57 Reason: 1
re bonjour,

j'ai trouve pour réinitialise le terminal

Merci quand même

Cordialement Philippe

icare

Bonsoir,

re bonjour,
j'ai trouve pour le réinitialise le terminal
Merci quand même
Cordialement Philippe

Tu pourrais faire profiter la communauté de ta solution  :smiley-roll:
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

philippe57

voici le bout de code :

Code: [Select]

void clearAndHome()
{
Serial.write(27);       // ESC command
  Serial.print("[2J");    // clear screen command
  Serial.write(27);
  Serial.print("[H");
}


après j'ai mis la fonction "clearAndHome()" juste avant mon debug serial ( mon bout code pour le debug)

a savoir que ça fonctionne avec putty mais pas avec le terminal arduino

Cordialement Philippe

fdufnews


voici le bout de code :

Code: [Select]

void clearAndHome()
{
Serial.write(27);       // ESC command
  Serial.print("[2J");    // clear screen command
  Serial.write(27);
  Serial.print("[H");
}


après j'ai mis la fonction "clearAndHome()" juste avant mon debug serial ( mon bout code pour le debug)

a savoir que ça fonctionne avec putty mais pas avec le terminal arduino

Cordialement Philippe

Normal le "terminal" de l'IDE arduino n'émule pas une VT100. En fait le "terminal" Arduino est une hérésie.

Go Up