Bonjour,
N’étant pas expert en code, je fais tout pour éviter d’avoir affaire aux pointeurs, mais malgré mon abnégation, ils finissent toujours par me rattraper…
Je code un petit programme de manipulation de trames GPS, le code marche bien, je suis maintenant en train de créer une librairie afin de raccourcir mon code, et d’implémenter un menu. Mais voila ce qui marchait sur mon code sans librairie, ne marche maintenant avec une librairie, et me retourne une erreur :
Programme_final_librairies.ino: In function ‘void loop()’:
Programme_final_librairies:33: error: invalid conversion from ‘char*’ to ‘char’
Programme_final_librairies:33: error: initializing argument 1 of ‘int USBL::checkline(char)’
Voici mon main:
#include <USBL.h>
#include <ctype.h>
#include <string.h>
/*librairie USBL*/
USBL usbl;
/*--------déclaration des variables globales au programme------*/
extern char line[200];
extern int length;
/*-------- fonction de setup des ports série ----------*/
void setup(){
Serial.begin(4800);
Serial1.begin(19200);
Serial2.begin(4800);
Serial3.begin(19200);
for (int i=0;i<200;i++) { //RAZ du buffer
line[i] = ' ';
}
}
void loop(){
char ByteGAPS=-1; //variable de chaque byte reçus de la GAPS
int result = 0; //résultat de reconnaissance de ligne
if(Serial.available()){ //si on reçoit qqchose sur le port d'entrée
ByteGAPS=Serial.read(); //on store le bit reçu dans ByteGAPS
line[length]=ByteGAPS; //on store le ByteGaps indexé dans le buffer de lignes
length++;
if(ByteGAPS == 13){ //si on recoit un bit de retour chariot (correspondant à la fin d'une ligne) ('/n' == 0x13)
line[length] = (0); //declaration de la fin de ligne
result = usbl.checkline(line); // "1" si GGA, "2" si PTSAG
}
}
}
Mon .cpp:
#include "USBL.h"
#include "string.h"
#include "ctype.h"
USBL::USBL() {
};
USBL::~USBL() {
};
char line[200]; //déclaration du buffer de ligne
int length = 0; //compteur de l'index du buffer de ligne
/* Fonction de reconnaissance de ligne, renvoie "1" pour GGA, "2" pour PTSAG */
int USBL::checkline(char ligne[]) {
char commandGPGGA[7] = "$GPGGA"; //pour vérifier le début des lignes voulues
char commandGPVTG[7] = "$GPVTG";
char commandHEHDT[7] = "$HEHDT";
char commandPTSAG[7] = "$PTSAG";
int bien = 0; //compteur de reconnaissance de début de lignes
Serial2.print(line);
int i;
int j;
for (i=0; i<7;i++){ //boucle de reconnaissance de début de ligne
Serial2.print("test");
if(ligne[i] == commandGPGGA[i-1]){ //En cas de ligne GPGGA, on renvoie "1"
bien++;
if (bien == 6){
Serial2.println("ligne GPGGA");
Serial2.println(ligne);
return 1;
}
} else if (ligne[i] == commandHEHDT[i-1]){ //En cas de ligne HEHDT, on renvoie "1"
bien++;
if (bien == 6){
Serial2.println("ligne HEHDT");
Serial2.println(ligne);
return 1;
}
} else if (ligne[i] == commandGPVTG[i-1]){ //En cas de ligne GPVTG, on renvoie "1"
bien++;
if (bien == 6){
Serial2.println("ligne GPVTG");
Serial2.println(ligne);
return 1;
} else if (ligne[i] == commandPTSAG[i-1]){ //En cas de ligne PTSAG, on renvoie "2"
bien++;
if (bien == 6){
Serial2.println("ligne PTSAG");
Serial2.println(ligne);
return 2;
}
for (j=0;j<200;j++) { //RAZ du buffer
ligne[j] = ' ';
}
length = 0; //RAZ de l'index du buffer
}
}
Et enfin mon .h:
#ifndef USBL_H
#define USBL_H
#include "Arduino.h"
class USBL {
private:
//rien
public:
USBL();
~USBL();
int checkline(char);
};
#endif
Ma question est la suivante, à quel moment mon paramètre ligne est associé à un pointeur ? Est-ce lors de sa déclaration char line[200], je pensais que cette déclaration était associé à un tableau de char de 200 caractères justement. Ou ai-je fais une erreur dans la déclaration des variables dans la librairie (ce qui est fort probable).
Merci à vous, Vincent