difficultés à faire appel à une fonction depuis une librairie

Bonjour, je suis nouveau dans la programmation, et j’ai écrit un programme de conversion de trames spéciales dans un format GPS.

Le programme est fini et marche, seul problème je voudrais implémenter un menu, et pour cela je suis en train de creer des librairies pour éviter un programme long de 3 kilomètres.

Je commence tout juste à créér ma librairie, seulement voila j’ai fait un test avec un librairie tout con, et une fonction printonscreen qui marchait nickel, mais au moment d’implanter des fonctions de mon programme, je reçoit un message d’erreurs :
"
Programme_final_librairies.ino: In function ‘void loop()’:
Programme_final_librairies:31: error: ‘class USBL’ has no member named ‘checkline’
"

Ci-dessous le code:

classe header:

#ifndef USBL_H
#define USBL_H

#include "Arduino.h"

class USBL {
private:
//rien

public:
	USBL();
	~USBL();
	void printonscreen();
	void checkline();
};

#endif

classe cpp:

#include "USBL.h"
#include "string.h"
#include "ctype.h"


USBL::USBL() {
	};

USBL::~USBL() {
	};


void USBL::printonscreen() {

	Serial.println("Hello");
}

void USBL::checkline() {

int bien = 0;				//compteur de reconnaissance de ligne
line[length] = (0);			//on force la fin de ligne du buffer

for (i=0; i<7;i++){                  //boucle de reconnaissance de debut de ligne
	if(line[i] == commandGPGGA[i-1]){              //En cas de ligne GPGGA, on envoie au port TLL+GPGGA
        bien++;
        if (bien == 6){
			Serial3.println("ligne GPGGA");
			Serial3.println(line);
        }
      } else if (line[i] == commandHEHDT[i-1]){      //En cas de ligne HEHDT, on envoie au port TLL+GPGGA
        bien++;
        if (bien == 6){
			Serial3.println("ligne HEHDT");
			Serial3.println(line);
        }
      } else if (line[i] == commandGPVTG[i-1]){      //En cas de ligne GPVTG, on envoie au port TLL+GPGGA
        bien++;
        if (bien == 6){  
			Serial3.println("ligne GPVTG");
			Serial3.println(line);
        }
    } 
}

}

Enfin le main:

#include <USBL.h>
#include <ctype.h>
#include <string.h>

/*librairie USBL*/
USBL usbl;

/*--------déclaration des variables globales au programme------*/
char line[200];          //déclaration du buffer de ligne
int length = 0;          //compteur de l'index du buffer de ligne
char ByteGAPS=-1;        //variable de chaque byte reçu de la GAPS


/*-------- fonction de setup des ports série ----------*/
void setup(){                  
  Serial.begin(4800);         
  Serial1.begin(19200);       
  Serial2.begin(4800);        
  Serial3.begin(19200);
}

void loop(){
  
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)
  usbl.checkline();
//  usbl.printonscreen();
//  delay(1000);
}

}

Sachant que avant quand j’avais que la fonction printonscreen, ça marchait très bien, et je l’ai testé en affichant des variables sans soucis en modifiant que la fonction dans la librairie, donc je pense que le main appelle bien la dernière version de la librarie.

Y-a t’il une manip spéciale quand on passe à plusieurs fonctions dans une librairie ou ai-je fait une erreur ??

Ma carte est une arduino Mega, et j’utilise la version 1.0.5-r2

Merci d’avance, Vincent

Où as-tu placé ta librairie?

Si ta librairie est placée dans le même répertoire que le .ino il faut déclarer les include avec #include “USBL.h”
Si ta librairie est placée dans le répertoire libraries il faut déclarer les include avec #include <USBL.h>

Ma librairie est placée dans le repertoire des librairies arduino, ce n'est pas le problème puisque j'ai accés à la fonction printonscreen lors de mon premier test...

C'est juste quand je veux appeler la fonction checklin que j'ai mon erreur.

De toute façon ta méthode checkline n'a aucune chance de compiler correctement, elle fait appel à des variables globales qui sont définies dans ton main.ino mais nulle part dans USBL.h ou USBL.cpp.

À part ça, l'erreur que tu indiques ne semblent pas correspondre au code posté. À mon avis (mais je peux me tromper) tu dois avoir plusieurs versions de la librairie qui traînent et celle qui est incluse n'est pas celle que tu crois (typiquement une "ancienne" version qui contient printonscreen mais pas encore checkline).

Ah ok, du coup les variables globales sont à déclarer dans le .cpp et le .h et non dans le main ?? Quand aux variables locales ??

Dans le .h, les variables globales sont à déclarer en public ? Sinon personne aurait idée d'ou je peux trouver des tutos de création de librairies plutôt bien faites, l'exemple d'Arduino et général c'est des libraries pour un blink de led, sans utilisation de variables etc...

Par ailleurs, une autre question, peut-on appeler une fonction d'une librarie, depuis une fonction de cette même librairie ?

Tu as surement raison pour la version de la librairie, car le résultat de ne correspond pas à ma fonction.

Merci pour ta réponse, Vincent