Bonjour à tous !
Je vous explique mon souci. J'ai a faire communiquer un peripherique par liaison RS232. Je dois l'interroger en liaison modbus (Protocole RTU), puis stocker ce qu'il me retourne dans un base de donnée SQLITE3.
J'ai donc un petit programme qui gere une connexion a une BDD que voici.
Mon main :
Mon deuxieme fichier, ou il y a les declarations des prototypes de fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 #include <iostream> #include <sqlite3.h> #include "tRs232.h" #include "Sauv&restore.h" using namespace std; #define DBNAME "energie_linux.sqlite3" int callback(void *NotUsed, int argc, char **argv, char **azColName) { cout << "debut"; for(int i=0; i<argc; i++) { // Affichage des resultats des requetes printf("%s = %s", azColName[i], argv[i] ? argv[i] : "NULL" ); } cout <<"fin"<< endl; return 0; } int main(int argc, char *argv[]) { sqlite3 *db; int choix; //Connexion cout << endl << "Connexion à la base de données en cours ..." <<endl; bddconnect(db); cout << endl <<"Menu :" << endl << endl; cout << "Sauvegarder la configuration ---------------- 1" << endl; cout << "Restaurer les parametres de la passerelle --- 2" << endl; cout << "Quitter ------------------------------------- 3" << endl; cout << endl << "Choix ??? >> "; cin >> choix; cout << endl; if (choix == 1) { // Sauvegarde de la configuration querysave(db); } if (choix == 2) { // Restauration des parametres queryrestore(db); } if (choix == 3) { // Deconnexion cout << "Deconnexion ..." << endl; bdddisconnect(db); // Quitter return EXIT_SUCCESS; } }
Et enfin mes fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef SAUVREST_H #define SAUVREST_H // ---------------- PROTOTYPES DES FONCTIONS ---------------------- #include <sqlite3.h> #include <errno.h> int bddconnect(sqlite3 *bdd); int callback(void *NotUsed, int argc, char **argv, char **azColName); int querysave(sqlite3 *mabase); int queryrestore(sqlite3 *mabase); int bdddisconnect(sqlite3 *bdd); #endif
Remarque : Ne vous inquietez pas, je consulte des données avec les requetes ici présentes, je n'enregistre rien... alors que je devrais le faire pourtant, j'aviserai une fois mon probleme resolu pour enregistrer dans la base de donnée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 #include <iostream> #include <errno.h> #include <sqlite3.h> #include "Sauv&restore.h" using namespace std; #undef DBNAME #define DBNAME "energie_linux.sqlite3" // ------------------------- CONNEXION A LA BASE DE DONNEE --------------------------- int bddconnect(sqlite3 *bdd) { if(sqlite3_open(DBNAME,&bdd) != SQLITE_OK) { sqlite3_close(bdd); cerr << "erreur connexion !!" << endl; return -1; } cout << "connexion réussie !" <<endl; return 0; } // ------------------------------ DECONNEXION DE LA BASE DE DONNEE --------------------------- int bdddisconnect(sqlite3 *bdd) { sqlite3_close(bdd); cout << "Deconnexion réussie ! Au revoir !" << endl; return 0; } // ---------------- SAUVEGARDE DES CONFIGS ------------------ int querysave(sqlite3 *mabase) { char *errormsg; int rc = sqlite3_exec(mabase, "SELECT mesure FROM energieP", callback, 0, &errormsg); if (rc != SQLITE_OK) { cerr << "SQL error: " << errormsg << endl; sqlite3_free(errormsg); return -1; } return 0; } // ---------------- RESTAURATION DES CONFIGS ------------------ int queryrestore(sqlite3 *mabase) { char* errormsg; if (sqlite3_exec(mabase, "SELECT mesure FROM energieQ", callback, 0, &errormsg) != SQLITE_OK) { cerr <<"SQL error : " << errormsg << endl; sqlite3_free(errormsg); return -1; } return 0; }
La compilation se passe sans aucun probleme. J'arrive a me connecter à la BDD et à me deconnecter parfaitement, mais lors de l'execution d'une requete, j'ai une erreur de segmentation. Cela viens certainement du callback.
De plus, je souhaiterai bouger le callback dans l'autre fichier, ou je declare toutes mes fonctions, pour pouvoir par la suite compiler ces fichiers avec mes classes de communication modbus et mes classes de construction de trames.
Si quelqu'un a une idée, qu'il ou elle me fasse signe !
Merci d'avoir pris le temps de lire ceci =)
Partager