[Arduino] Transferer et Parser des données Arduino

L’espace pour parler de tout ce qui concerne l’électronique embarquée
Avatar de l’utilisateur
Geeks
Messages : 3593
Inscription : 03 juil. 2010 21:04
Localisation : Brive la Gaillarde (Correze 19)

Re: Transfer et Parser des données Arduino

Message par Geeks »

Oui, en effet, il faut que tu choisisse une lettre. Là, j'ai du adapter deux lignes et je me suis mélanger les pinceaux. Donc si j'ai utiliser int 1 = 0; ben il faut utiliser "i" dans la boucle et sur la ligne "for()". En théorie, on utilise "i", "j" ou "k". Mais uil n'est pas interdit d'utiliser "zz"... ou "ii"...

Ensuite, si tu a les bonnes valeurs, il faut regarder s'il ne te faut pas de conversion. Un string acceptera des integer "int" dedans, il me semble. Mais on réceptionne sur des bytes qui eux n'accepte que des valeurs de 0 à 255 (donc pas les nombres à virgule). Donc il faudra adapter.

Je vais te donner un lien vers un forum ou tu pourra traiter de CE sujet ; à Savoir la réception de données brute et le retraît du byte.
1/ Le lien : http://forum.arduino.cc/index.php/board,33.0.html (Forurm arduino Français)
2/ Poste y la trame que tu envoie, et le code de réception.
3/ Pense à ajouter tes déclaratif, ton initialisation, ta boucle, tes fonctions.
4/ Indique que tu utilise du byte en réception et qu'à priori il ne gère pas les nombres à virgule. Cf mon explication du dessus.
5/ Je passerais sur le fofo pour voir si une piste se dégage et éventuellement pour aider si je peux, connaissant le sujet.

Je tiens à précisé que je ne me décharge pas de ce code. Je donne une piste pour pouvoir l'adapter. Et qui est mieux pour adapter mon code à sa propre problématique que le programmeur de son propre soum ? Donc papy, ici on essaiera de discuter ensemble de la solution finale et des possibilités offertes et là bas du code lourd avec, bien souvent des solution passant par des pointeurs.

D'ailleurs tu a du en remarqué des pointeurs dans la réception. C'est ce qui permet de sauter dans la boucle avec le strtok_r(); Dans la seconde ligne c'et un NULL car le pointeur sait là ou il en est et incrémente de lui-même. Elle est pas belle la vie 8-)

Dans tous les cas, Papy et ça vaut pour toute programmation et tous programmeur. Il faut rester calme. Il peut s'écouler un long moment avec une réponse et il ne faut pas hésiter à re-concevoir la trame et les valeurs transmises. Si on y arrive pas totalement en réception, il faudra alors adapter l'émission. Mais là, dans notre cas, c'est le byte qui fiche le bazar.

Si une piste se dégage et qu'une correction permet la résolution de ce problème, on ne manquera pas de le rajouter là avec les liens de la discussion sur le form pour que le novice qui cherche à faire la même chose puisse trouver la solution.

Voila, j'espère vraiment qu'on arrivera à trouver. Mais je réserve une piste potentielle sur un site pro au cas. :Up:
A défaut d'avoir la science infuse, j'infuse la science. - Racleur de fond depuis Pons 2014.
Sous-marin en état de repos sur cale : Minimog 01
Avatar de l’utilisateur
papy94
Messages : 653
Inscription : 23 janv. 2010 14:31
Localisation : Champigny sur marne
Contact :

Re: Transfer et Parser des données Arduino

Message par papy94 »

Donc voici les codes que j'utilise pour avec ma 2ieme carte Arduino NANO

Les données que je veux recevoir sont:
_le numéro d'alarm
_le niveau (angle de mon soum)
_la profondeur du soum
_la temperature interne
_la tension batterie

c'est le numéro d’alarme reçu qui fait réagir ma 2ieme carte Arduino NANO
Alarm = 0 : RAS -> LedVerte();
Alarm = 1 : Periscope Haut -> LedVerte();
Alarm = 2 : Periscope Bas -> LedVerte();
Alarm = 3 : Accelerometre -> LedBleu();
Alarm = 4 : Profondeur Maxi -> Vidange(); LedBleu();
Alarm = 5 : Temperature -> Arret(); Vidange(); Remonte(); LedRouge();
Alarm = 6 : Batterie Faible -> Arret(); Vidange(); Remonte(); LedRouge();
Alarm = 7 : Perte de signal radio -> Arret(); Vidange(); Remonte(); LedRouge();
Alarm = 8 : Eau dans compartiment -> Arret(); Vidange(); Remonte(); LedRouge();

les autres paramètres seront simplement envoyés sur la carte SD, pour analyse

Sur ma 1ere carte Arduino NANO
mes variables sont déclarées comme ça:

Code : Tout sélectionner

int Alarm = 0;// variable pour Numero d alarm
int Val_X = 0;// variable pour angle X accelerometre 3 axes MMA7361 (sorties analogiques)
int Pression_Relative;// Difference de Pression entre la Surface et la Pression lut
float Tension = 0;//variable tension batterie
et j’envoie comme ça:

Code : Tout sélectionner

Serial.print("<");
  Serial.print(Alarm);Serial.print(";");
  Serial.print(Val_X - Ang_Milieu);Serial.print(";");
  Serial.print(Pression_Relative);Serial.print(";");
  Serial.print((bmp.readTemperature()*100),0);Serial.print(";");
  Serial.print((Tension*100),0);
  Serial.print(">");
  Serial.println();
Pour la pression relative et le bmp.readTemperature,je divise par 100, pour envoyer un chiffre sans virgule
la trame envoyée ressemble donc a ceci : <1;-3;16;2294;531>
'<' = le début de la trame
'>' = la fin de la trame
';' = délimiteur des données

Sur ma 2ieme carte Arduino NANO

Code : Tout sélectionner

/*carte Nano RECEPTRICE
 arduino v1.0.1

 donnees (trame) recus : <1;-3;16;2294;531>
 '<' = le debut de la trame
 '>' = la fin de la trame
 ';' = delimitateur des donnees
*/

//----------
String Trame;              // Chaine pour contenir la Trame entrante
boolean TrameRecu = false; // si la Trame a ete recue dans son integralité
int NbrData = 4;           // Nombre de donnes qui seront recus   exemple: 5 valeurs : 1;-3;16;2294;531

//========================
void loop() {
  handleCommand();



} //FIN LOOP
//=======================


//************************* routines
void serialEvent(){
  while (Serial.available()) {// si recois des donnes
    char incomingByte = (char)Serial.read();
    if (incomingByte == '>') { // Fin de la Trame
       TrameRecu = true;
       return;
    }else if (incomingByte == '<'){ // Debut d une nouvelle Trame
       Trame = "";
       TrameRecu = false;
       return;
    }else{
      Trame += incomingByte;
      return;
    }
  }
}

void handleCommand() {
  if (!TrameRecu) return; // aucune Trame a parser
  int data[NbrData];     // un maximum de 5 nombres entiers de donnees
  char cmd[Trame.length()+1];
  Trame.toCharArray(cmd, Trame.length()+1);
  char *token = strtok(cmd, ";");

  for (int i = 0; i < NbrData+1; i++) { // mettre datas dans tableau
    if (token) {
      data[i] = atoi(token);
      token = strtok(NULL, ";");
    }
 }
//---Pour verif sur monitor de ce qui a ete recu
  Serial.print("data[0] = ");Serial.println(data[0]);
  Serial.print("data[1] = ");Serial.println(data[1]);
  Serial.print("data[2] = ");Serial.println(data[2]);
  Serial.print("data[3] = ");Serial.print(data[3]/100);Serial.print(".");Serial.println(data[3]%100);
  Serial.print("data[4] = ");Serial.print(data[4]/100);Serial.print(".");Serial.println(data[4]%100);
  TrameRecu = false;// Drapeau pour dire que nous avons traite la commande
 }
//************************Fin routines
data[de 0 à 4] contient mes 5 données 1 -3 16 22.94 5.31
pour data[3 et 4],Je multiplie par 100, pour remettre la virgule

J'ai extrais le code de mon programme principal pour simplifier la compréhension, je ne pense par avoir oublié de lignes, je n'ai pas testé ce programme court,mais cela fonctionne très bien avec le programme principal

bien sur , il y a surement une meilleur façon d’écrire ce code,mais cela fonctionne et cela me suffit
Répondre