Bonjour,
Pour le contexte, je bosse sous LabWindows, je communique avec une machine via gpib pour faire de l'acquisition de données, en l'occurrence, je souhaite récupérer régulièrement (via timer) une température (ordonnée) et un temps (abscisse) pour construire un graphique. Pour la température tout va bien j'arrive à extraire la donnée et à la stocker.
Pour le temps ça se complique car le format de réponse de la machine est le suivant : nombre, nombre, nombre.nombre, nombre:nombre, nombre
exemple : 1, 2, 27.0, 1:30, 5
Dans cet exemple je dois donc extraire les nombres avant et après le ":", ici le 1 et le 30. Mais ce temps est un temps restant or je veux un instant je fais donc un calcul après du genre : instant de la mesure = temps total - temps restant
Voici ce que j'ai codé :
En gros toutes les secondes, je dessine un point sur un graphique avec en ordonnée t_oven et en abscisse x_oven, le soucis ici c'est que x_oven est toujours égal à 0. j'ai essayé énormément de chose, changer les types des variables, changer le formattage du sscanf, utiliser d'autres fonctions que atoi etc... pour tester mais bon... les résultats sont parfois surprenants !
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 int CVICALLBACK TimerCB (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { char moni_com[100]; char moni_resp[50]; char trash[10], trash2[20]; //tableaux poubelle switch (event) { case EVENT_TIMER_TICK: sprintf(moni_com, "PRGM MON?"); ibwrt(BoardDevice, moni_com, strlen(moni_com)); //j'envoie la commande contenue dans moni_com à la machine ibrd(BoardDevice, moni_resp, 100); //je réceptionne la réponse dans moni_resp. sscanf(moni_resp, "%*[^,]%*c%[^,]%*c%[^,]%*c%[^:]%*c%[^,]",trash, trash2, hr, m); //hr et m ont été initialisé en global char hr[4] et char m[3]; x_oven = (min + 60*h) - (60*atoi(hr) + atoi(m));//temps à l'instant x = temps total - temps restant ; min et h sont déterminés en dehors de cette fonction. PlotPoint(panel3, PANEL3_GRAPH, (double)x_oven, (double)t_oven, VAL_SIMPLE_DOT, VAL_BLACK); //j'ai enlevé tout le code pour t_oven car pas utile //j'ai pris la minute pour unité dans mon graphique dans la réalité mais pour les tests j'ai réglé le timer sur la seconde pour pas attendre 1 minute à chaque fois ^^" break; } return 0; }
Bref, je galère depuis ce matin là dessus, j'ai l'impression que plus je cherche une solution, plus je me complique la vie et plus je m'éloigne.. j'ai regarder ce lien : http://nicolasj.developpez.com/articles/regex/#LIV-B
Vu que la réponse de la machine aura toujours ce format je me suis dis qu'un regex serait la bonne solution et résoudrait simplement mon problème mais je trouve le code du lien très compliqué, je ne vois pas du tout comment construire mon regex et utiliser les fonctions associées..
Auriez-vous une solution simple à me proposer ?
Merci d'avoir lu le texte jusque ici, j'ai tendance à trop blablater sur les détails ^^"
Edit : Ha, bah les regex n'ont pas l'air utilisables sous LabWindows il ne trouve pas regex.h..
Partager