communication serie autre logiciel que terminal

Bonjour,

Je suis sur un projet de commande de servo via la reception de valeur depuis le port serie.
Pour résumer, j’ai un logiciel de décodage de radiosonde météo qui m’affiche l’azimut et l’élevation de la sonde. Il renvoie ces informations part un port serie.
Voici la trame envoyé:

AZ180 EL020
W180 020

Je veux récupérer les valeurs 180 et 020

J’ai commencé par voir la trame serie envoyé par le logiciel utilisé sur le “Monitor Serie” du programme Arduino.
Mon logiciel communique parfaitement avec le terminal et je peux voir les trames arriver.

Ensuite, j’ai essayé d’envoyer manuelement une trame depuis le “monitor serie” vers l’Arduino, et là encore, pas de soucis. Je peux l’afficher sur un LCD et même recupérer les valeurs souhaité.

Le soucis arrive quand j’essaye d’envoyer les trames depuis mon logiciel vers l’arduino. Il ne se passe rien. Quoique la LED RX s’allume de temps en temps. (Reception de trames, je pense) Mais pas d’affichage des valeurs sur le LCD.
Je suis en connection par USB.

Peut être cela vien du taux de transfert (ici=115200) mais j’ai déjà essayé plusieurs valeurs et ça ne change rien.
J’ai aussi pensé au retour chariot, je me’explique, la trame arrive sur deux ligne. mais quand je l’envoye depuis le monitor serie, je l’envoye que sur une ligne. Mais si c’est ça, je ne sais pas comment faire.

Carte utilisé: Arduino UNO

voici le petit code test:

// test reception serie depuis C34
#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //pin LCD

void setup() {
 // initialize serial:
 Serial.begin(115200);
 // initialize LCD
 lcd.begin(16,2);
 lcd.print("AZ EL soft");

}

void loop() {
 // if there's any serial available, read it:
 while (Serial.available() > 0) {
   int index=Serial.read(); // lire un premier caractère
   
   // controle éventuel : décommenter pour voir ce qui arrive
   Serial.print("index : "); Serial.println(index);


   // filtrer : il doit etre une lettre minuscule ou majuscule
   if(index >= 'A' && index <= 'z'){
     int valeur = Serial.parseInt();
     
     // controle eventuel de la valeur
     //Serial.print("valeur : "); Serial.println(valeur);


     // traitement
     switch(index){
       
     case 'A': // renvoie la valeur AZ
       // allume la led si le chiffre est superieur a 0
        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print("AZ");
        lcd.setCursor(4, 0);
        lcd.print(valeur);
       break;


     case 'E': // renvoie la valeur EL.
        lcd.setCursor(1, 1);
        lcd.print("EL");
        lcd.setCursor(4, 1);
        lcd.print(valeur);
       break;

     }

   }

 }
 delay(10); 
}

Meilleurs salutation et bonne soirée…

Salut,

Remplace cette line
// controle éventuel : décommenter pour voir ce qui arrive
Serial.print("index : "); Serial.println(index);

Par

// controle éventuel : décommenter pour voir ce qui arrive
Serial.print("index : "); Serial.print(index);

Bonjour et merci,

Cette fonction et un contrôle de se qui se passe. Normalement elle est en commentaire. Je l'avais mise en fonction pour justement voir se qui se passait, et j'ai oublié de remettre le code normal avant de le copier et le poster.

Je vois le pourquoi de votre message, le "ln" de remise à la ligne. Mais ça ne viens malheureusement pas de là, vu que se code sert à envoyer la valeur a l'ordinateur, et mon soucis est que je n'arrive pas a recevoir depuis un autre programme que "monitor série" sur le arduino.

Merci quand même...

Non je confond, c'est quand l'arduino répond à mon programme que je dois utiliser la table ASCII.

C'est toi qui le développe ce logiciel externe ou tu dois t'adapter à ce qu'il t'envoie ?

Pour commencer, j'essayerai quelque chose comme ça

while (Serial.available() > 0) {
   int index=Serial.read(); // lire un premier caractère
   switch(index)
  {
    case 65:
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("AZ");
      break;
    case 69:
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("EL");
      break;
  }
}

Merci, je vais essayer ça.

Je dois m'adapter au programme, et en plus je n'ai pas beaucoup d'information sur ce soft.
Je ne sais même pas qui l'a fait et oû le télécharger.

Tous se que je sais, c'est qu'il peut piloter un système de rotor azimut/élévation nomé "LVB".
En voyant par port COM la fameuse trame que j'aimerais récupérer...

Je vous tient au courant.

Si tu ne connait pas le protocole de programmation il va falloir tout tester. Ca peut se faire simplement : a chaque trame reçu tu l'affiches sur le LCD avec les paramètres correspondants et tu modifies les paramètres série pour te préparer à la prochaine trame et ainsi de suite.

Après pour la séparation plusieurs méthodes, les plus courantes :

  • caractère à caractère : tu attends de recevoir "E" puis "L" puis tu enregistre ce qui suit et atoi()
  • tu récupère tout puis tu tries avec strok() et strtol()

Bonjour,

On dit que la nuit porte conseil. En fait, vu que je travail de nuit, je me suis mis à la recherche d'information sur le protocole serie de ce logiciel. Et j'ai cherché à l'envers, en commençant par trouver le protocole nécessaire pour le "LVB".
Et mes doutes étais juste, c'est bien un problème de taux de transfert.
Il fallait mettre:

Serial.begin(9600);

Du coup, ça fonctionne très bien maintenant. Dès que le logiciel envoie une trame, l'Arduino affiche les valeurs souhaité sur le LCD.
J'ai crié aussecourt trop vite. Mais il me semblait avoir essayé avec 9600Bauds, faut croire que non... :blush:

Pour les curieux, j'ai trouvé se PDF sur la configuration du "LVB" (l'interface que je remplace par l'Arduino)
http://f5gva.pagesperso-orange.fr/Documentation_fichiers/Installation%20de%20votre%20nouveau%20LVB%20Tracker%20Box.pdf

Encore merci et en espérant que ça pourra servir à quelqu'un quand même.

Bonjour,

Mon problème est résolu, mais je me pose quand même une question.
Je ne maîtrise pas encore la communication serie, donc je suis curieux.

Pour rappel, la chaîne de caractère que je reçois de mon logiciel de tracking est:

AZ180 EL020
W180 020

Pour un azimuts à 180* et une élévation à 20*

Maintenant, un autre logiciel, pour le tracking des satellites cette foi, m'envoie seulement la chaîne:

W180 020

Comment pourrais-je faire pour extraire le 180 pour l'angle du servoazimuts et le 20 pour l'angle du servo élévation.

Je n'en ai pas vraiment l'utilité vu que mon but était le suivi de radiosonde et mon système fonction à merveille(enfin, la programmation pour l'instant, la mécanique pose encore des problèmes)
Mais comme dit plus haut, je suis curieux. Et de plus, pourquoi pas le rendre compatible, ça peu servir.... XD
J'ai bien cherché des solution, mais je ne connais pas assez la communication serie.

Bonne soirée, et au plaisir

Si tu a récupéré la chaine dans un tableau par exemple et qu'elle a toujours la même longueur tu la parcours avec une boucle For ou While et tu récupères les infos au fur et à mesure dans les variables de ton choix.

Par exemple ici je récupère chaine2 dans buf 1 et buf2:

// Start conversion
     int k=0;
     int l=0;
     while (chaine2[k]!=';'){
     buf1[l] = chaine2[k];
     k++;
     l++;
     }
     buf1[l]='\0';
     k++;
     l=0;
     while (chaine2[k]!='\0'){
     buf2[l] = chaine2[k];
     k++;
     l++;
     }