Show Posts
Pages: [1]
1  International / Français / Re: pb d'identification de caractère sur le port serie on: June 19, 2012, 09:41:05 am
c'est bon,
tout marche parfaitement bien maintenant.
J'utilise le connecteur USB depuis mon PC ainsi que les i/o série vers mon PNA via un cable micro USB en mode serie (pas USB) et il n'y a pas de problème particulier.
Etape suivante: accélérer le calcul.
Merci,
à bientôt
Romaric
2  International / Français / Re: pb d'identification de caractère sur le port serie on: June 16, 2012, 02:47:34 am
ok je viens de piger: je ne maitrise encore pas totalement le forum  smiley-mr-green
Code:
[i]
sans balise particulière n'apparait pas (comme dans mon message précédant ou je l'ai pourtant bien écrit).

Pour le peek. dans les deux cas il était suivit d'un Serial.read: dans un cas en direct et dans l'autre cas dans la fonction appélée.
Pas grave j'ai maintenant utilisé la méthode qui fonctionne. smiley

Romaric
3  International / Français / Re: pb d'identification de caractère sur le port serie on: June 16, 2012, 02:24:22 am
oui j'ai vu ça mais les sont bien dans le code...
merci

à présent:
je n'utilise plus serial.peek et il n'y a plus pb de caractère raté.
Dommage je trouvais ça plus élégant que la methode du caractère intermédiaire mais ça ne fonctionne pas (une limitation de peek?).

j'ai avancé.
Maintenant je suis sur le crc32  de la chaine que j'envoie (c'est pas un xor).

romaric
4  International / Le bar / Re: Presentez vous on: June 15, 2012, 06:51:54 am
Bonjour à tous,
Moi c'est Romaric (comme mon pseudo l'indique  smiley-mr-green) vétérinaire 31 ans.
J'ai débuté l'informatique sur le tandy 1000 que mon père a acheté en 1986 (à peu près). Du basic tout simple mais bon j'avais 8 ans...
Puis une option sympa en seconde: informatique et electronique en science physique. bref on faisait des expérience du genre: récupérer de couples pressions-températures via des sondes electroniques reliés au PC via une boite (ça s'appelait Orphy il me semble) pour trouver la loi qui liait les deux valeurs.
Pendant mes études: pas grand chose sur le sujet, plutôt du sport.
Enfin, depuis que je bosse je me suis pris d'intérêts pour le planeur et l'open source.
Je suis plutôt touche à tout: création du site web de mon club de planeur, traduction en français du manuel et de l'interface d'un logiciel de navigation en planeur fonctionnant sur PNA.
Je suis tombé sur arduino par hasard et j'ai d'abord voulu faire  un distributeur de croquettes intelligent pour mon chat avec la lecture de sa puce électronique. Puis j'ai eu pleins d'idée pour l'utiliser à mon boulot: surveillance d'anesthésie, coloration de frottis sanguins, surveillance de débit de perfusion etc.
Maintenant je suis sur la création d'un capteur qui envoie des infos à mon logiciel de navigation en planeur sous forme de phrases standardisées via le port série (et c'est le premier projet qui va si loin  smiley-grin)

J'ai beaucoup trainé sur ce forum avant de m'y inscrire pour mon premier soucis insoluble dans mes toutes nouvelles connaissances.
mes forum/sites de prédilection: volavoile.net, condorsim.fr, lk8000.it, framasoft, site du zero, arduino.cc, mon-club-elec.

A bientôt
Romaric
5  International / Français / Re: pb d'identification de caractère sur le port serie on: June 15, 2012, 05:05:28 am
ah oui tiens,
c'est parceque au début, je ne lisais que "PGRMZ" j'ai pas correctement modifié le test.
Pour strncmp(), je ne suis qu'un débutant en C, j'utilise mes restes de "BASIC" de la fin des années 90 :-) et là c'est déjà bien mieux que la première version avec pleins de variables à porté général (j'ai potassé les pointeurs) mais c'est prévu pour la suite, tout comme l'utilisation de sscanf() pour extraire mon info (pour l'instant c'est aussi une boucle faite maison),une fois que j'aurai trouvé mon pb.

Mais c'est vrai que sur le fond ça ne change rien, ça ne devrait pas laisser passer de trame au travers. pour moi le mystère demeure.

Pour le debug, je n'utilise pour l'instant que le terminal série pour envoyer les trames, recevoir des infos pour debug et voir ce qui serait envoyé réellement.

Autre étonnement: Serial.peek() me pose qq soucis: dans le tout début pas de pb, le caractère reste et le serial.read le retrouve. Mais lorsque le "$" arrive, la boucle de remplissage de ma chaine commence et Serial.read() lit direct le caractère suivant dans la file. Je doit entrer "$" manuellement au début de ma chaine pour contourner ça et ça fait pas très propre...

Je vais essayer de corriger ces petites ratures et voir.
Merçi
Romaric

en bonus le: reste du code  smiley-lol

Quote
int get_pstat(char nmea[]){
  char char_pstat[7]={'\0'};
  int pstat;
  for (int i=7 ; nmea!=',' ; i++){
    char_pstat[i-7]=nmea;
  }
 // Serial.print(char_pstat);Serial.println("pieds");
  pstat= atoi(char_pstat);
 // Serial.print(pstat);Serial.println("pieds");
  pstat=1013.25 * pow((288-(0.0065*pstat*0.3028))/288,5.255); //formule de conversion pieds en hpa
 // Serial.print("pstat "); Serial.print(pstat); Serial.println("hPa");
  return pstat;
}

void envoie_trame_ias(int ias){
//  Serial.println("envoie trame ias");
  char char_ias[4]={'\0'};

  char char_nmea_ias[15]="$PLKAS,";
  int n;
  itoa (ias,char_ias,10);
 // Serial.print("char_ias: "); Serial.println(char_ias);
  
  for (int i=7; char_ias[i-7]!='\0';i++){
    char_nmea_ias=char_ias[i-7];
    n=i;
  //  Serial.print("i= "); Serial.println(i);
  }
  char_nmea_ias[n+1]=',';
 /* char XOR=0;
  for (int i=0; char_nmea_ias!='\0';i++){
    XOR^=char_nmea_ias;
  }*/
  char_nmea_ias[n+2]=get_XOR(char_nmea_ias);
  char_nmea_ias[n+3]=13;
  char_nmea_ias[n+4]=10;
  Serial.print (char_nmea_ias);
  return;
}

char get_XOR(char trame[]){
 // Serial.println("get_XOR");
  char XOR='\0';

  for (int i=0; trame!='\0';i++){
    XOR^=trame;
  }
  return XOR;
}

6  International / Français / Re: pb d'identification de caractère sur le port serie on: June 14, 2012, 06:07:50 pm
mince j'avais viré toutes mes lignes de debug pour plus de lisibilité mais elles sont revenue...

Code:
#include <Wire.h>
#include <Adafruit_BMP085.h>
/* deuxième sketch pour IAS pour LK8000 dans une forme plus rigoureuse*/
//int ptot=1013; //à supprimer quand BMP085 dispo;
Adafruit_BMP085 bmp;
void setup(){
  Serial.begin (57600);
   bmp.begin();
}

void loop(){
  Serial.println("loop");
 
  while (Serial.peek()!='$'){
    if (Serial.available()<1){
      continue;
    }
    Serial.print(char(Serial.read())); //penser à enlever le LN!
  }
  char nmea[83]={'$'};
  get_nmea(nmea);  //entre toute la trame dans la chaine nmea
  if (get_entete(nmea)==true){  //si l'entete est celle qui donne la p_stat
    Serial.println("if_loop true");
    Serial.print("ptot "); Serial.print(bmp.readPressure()/100);Serial.println("hpa");
    int ias=10*sqrt((2*((bmp.readPressure()/100) - get_pstat(nmea)))/1.225);
         //calcul de l'IAS
    Serial.print("IAS caculé est de: "); Serial.print(ias);Serial.println("dm/s");//penser à enlever le LN!
    envoie_trame_ias(ias);
   
  }else {
    Serial.print("if loop false");
   // Serial.print(nmea);
  }
}

void get_nmea(char nmea[]){
 // Serial.println("get_nmea");
  for (int i=0; i<83; i++){
    while (Serial.available()<1);  // attente de 1 caractères dispo dans le buffer
    nmea[i]=Serial.read();  //replissage de la chaine nmea avec les caratcères dispo
    if (nmea[i]==10){  //si le caractère est <LF> on arrête de remplir
    //  Serial.print("caractere LF trouvé");
      break;                // et on quitte la boucle
    }
  }
  Serial.println(nmea);  // on renvoie la trame sur la sortie serie //penser à enlever le LN!
  return;
 
}
boolean get_entete(char nmea[]){
 // Serial.print(nmea);
  char entete_alti[8]="$PGRMZ,";
  for (int i=0;i<6;i++){
    if(entete_alti[i]!=nmea[i]){
     // Serial.print("condition fausse");
      return false;
    }
  }
  return true;
  }
 
7  International / Français / pb d'identification de caractère sur le port serie on: June 14, 2012, 06:03:51 pm
Bonjour à tous,
Après une semaine sur mon pb je le soumet à vos yeux neufs et expérimentés.
Mon projet:
identifier des trames nmea reçues sur le port serie, en identifier une en particulier et en extraire une info pour envoyer une nouvelle trame sur la sortie serie.

Après avoir réécris, nettoyé, debuggé le code, ça marche (reste quelques vérifications tout de même).

Mais certaines trames de sont pas identifiées (via le "$" qui marque le début) alors que j'ai l'impression d'analyser un par un tous les caractères reçus sur le port série...
mon code:

Quote
#include <Wire.h>
#include <Adafruit_BMP085.h>
/* deuxième sketch pour IAS pour LK8000 dans une forme plus rigoureuse*/
//int ptot=1013; //à supprimer quand BMP085 dispo;
Adafruit_BMP085 bmp;
void setup(){
  Serial.begin (57600);
   bmp.begin();
}

void loop(){
  Serial.println("loop");
  
  while (int n=Serial.peek()!='$'){
    if (Serial.available()<1){
      continue;
    }
    Serial.print(char(Serial.read())); //penser à enlever le LN!
  }
  char nmea[83]={'$'};
  get_nmea(nmea);  //entre toute la trame dans la chaine nmea
  if (get_entete(nmea)==true){  //si l'entete est celle qui donne la p_stat
    Serial.println("if_loop true");
    Serial.print("ptot "); Serial.print(bmp.readPressure()/100);Serial.println("hpa");
    int ias=10*sqrt((2*((bmp.readPressure()/100) - get_pstat(nmea)))/1.225);
         //calcul de l'IAS
    Serial.print("IAS caculé est de: "); Serial.print(ias);Serial.println("dm/s");//penser à enlever le LN!
    envoie_trame_ias(ias);
    
  }else {
    Serial.print("if loop false");
   // Serial.print(nmea);
  }
}

void get_nmea(char nmea[]){
 // Serial.println("get_nmea");
  for (int i=0; i<83; i++){
    while (Serial.available()<1);  // attente de 1 caractères dispo dans le buffer
    nmea=Serial.read();  //replissage de la chaine nmea avec les caratcères dispo
    if (nmea==10){  //si le caractère est <LF> on arrête de remplir
    //  Serial.print("caractere LF trouvé");
      break;                // et on quitte la boucle
    }
  }
  Serial.println(nmea);  // on renvoie la trame sur la sortie serie //penser à enlever le LN!
  return;
  
}
boolean get_entete(char nmea[]){
 // Serial.print(nmea);
  char entete_alti[8]="$PGRMZ,";
  for (int i=0;i<6;i++){
    if(entete_alti!=nmea){
     // Serial.print("condition fausse");
      return false;
    }
  }
  return true;
  }


merci pour vos avis eclairés
Romaric
Pages: [1]