Salut à tous,
Je suis actuellement en train de développer une application en VB qui permet de manipuler des données issues de capteurs, lesquelles sont ensuite consignées dans un fichier dans un format bien particulier (MoTeC pour ceux qui connaissent). Après avoir réussi à "décrypter" le fichier avec un éditeur hexadécimal, j'ai pu reconstituer les données qui transitent dans les différents canaux d'un réseau CAN, et les écrire ensuite dans un fichier texte (je précise que ce sont des fichiers assez lourds de plusieurs dizaines de milliers de lignes, je ne sais pas si ça a un rapport avec le problème que je vais décrire...).
Le problème que je rencontre est que, lorsque j'écris ces données dans mon fichier texte, les données sont absentes pour certains canaux. J'ai bien le "header" du canal (avec son numéro, son identifiant, l'adressage du canal suivant, l'unité du canal mesuré etc.), il manque juste les mesures. J'ai observé que je ne rencontrais le problème que sur certains canaux, qui ont tous en commun d'avoir le même nombre de mesures (les canaux ont différentes fréquences, donc pas le même nombre de mesures effecutées), en gros, les données sont réparties sur le même nombre de caractères. A noter que le nombre de mesures pour lesquelles je rencontre ce bug est différent suivant les fichiers d'entrée, et ne touche qu'un seul nombre de mesures.
Pour donner un exemple simple, j'ai 10 canaux avec 50 mesures effecutées (bon en réalité c'est bien plus mais là n'est pas le sujet je pense), 10 avec 100 mesures et 10 avec 200, et pour je ne sais quelle raison, pour les 10 canaux ayant 10 mesures, les mesures ne vont pas être écrites dans le fichier texte de sortie. Aucun souci pour tous les autres canaux. Et pour un autre fichier d'entrée, ça sera encore un nombre de mesures différent (par exemple pour un autre fichier ça sera sur les 10 canaux ayant 200 mesures, ou 50, bref ça dépend)...
Voici le code de la boucle qui permet de récupérer les données :
DataAddr est l'emplacement (en hexadécimal) à partir duquel les données sont écrites dans le fichier source, DataLength est le nombre de bits sur lesquels s'étendent ces données (dans l'éditeur hexadécimal, c'était regroupé 2 par 2, c'est la raison pour laquelle je multiplie par 2). inversion_data est une fonction permettant d'écrire les données en hexadécimal dans le bon sens (le but final étant ensuite de les convertir en décimal bien entendu).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Dim nb1 As Long = (2 * Val("&H" & DataAddr) + 1) Dim nb2 As Long = (2 * Val("&H" & DataAddr) + 1 + 2 * Val("&H" & DataLength) + 1) For i = nb1 To nb2 Step 4 Data = Mid(hexFile, i, 4) Data2 = inversion_data(Data) Data3 = Data3.Append(Data) Next Data = Data3.ToString
Dans mon fichier de sortie, je vais par exemple avoir ça, pour schématiser (bon en réalité dans mon fichier texte tout est encore en hexadécimal...) :
Voilà, désolé pour le pavé mais j'ai essayé d'être le plus clair possible. Merci d'avance pour votre aide, car je ne vois vraiment pas d'où peut venir le problème...
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 Canal 1 Nom du canal : Régime moteur Adressage des mesures : 003D4569 Longueur du bloc de mesures : 0002F5689 Mesures Canal 2 Nom du canal : Rapport enclenché Adressage des mesures : 004D6547 Longueur du bloc de mesures : 0002F5689 Mesures Canal 3 Nom du canal : Température pneu avant gauche Adressage des mesures : 004F9832 Longueur du bloc de mesures : 0001D5678 Pas de mesures écrites Canal 4 Nom du canal : Angle volant Adressage des mesures : 00569874 Longueur du bloc de mesures : 0001F5647 Mesures Canal 4 Nom du canal : Température d'huile Adressage des mesures : 005A6511 Longueur du bloc de mesures : 0001D5678 Pas de mesures écrites![]()
Partager