Bonjour à tous,

Je me tourne vers vous dans l'espoir d'avoir une petite aide à mon problème... en effet ca fait déjà 4 jours que je suis dessus et j'ai beau retourner le problème dans tous les sens je n'y arrive pas...

J'ai un fichier de config contenant du texte:

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
# Firmware variables
RFB_PATH=/dev/ttyUSB1
POWER_LED_PATH=/dev/ttyUSB2
BOOT_LED_PATH=/dev/ttyUSB3
FIRMWARE_LED_PATH=/dev/ttyUSB4
TX_LED_PATH=/dev/ttyUSB5
RX_LED_PATH=/dev/ttyUSB6
 
# Transmission variables
DEST_ID=0
SENSORS=45980
TX_INTERVAL_H=0
TX_INTERVAL_MS=2000
TX_MAX_NUMBER=500
TX_TOPOLOGY_INTERVAL=0
 
# Network variables
OPERATING_MODE=1
PAN_ID=250
ROLE=C
CHMASK=100000
MAC_ADDR=0
NET_ID=0
NODE_NAME=COORD
Dans mon fichier source contenant le main, je déclare donc les trois structures suivantes:

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
/* Firmware structure definition */
typedef struct {
   unsigned char RFB_PATH[20];
   unsigned char POWER_LED_PATH[20];
   unsigned char BOOT_LED_PATH[20];
   unsigned char FIRMWARE_LED_PATH[20];
   unsigned char TX_LED_PATH[20];
   unsigned char RX_LED_PATH[20];
} fwStr;
 
/* Transmission structure definition */
typedef struct {
   unsigned char DEST_ID[4]; 
   unsigned char SENSORS[4];
   unsigned char TX_INTERVAL_H[4];
   unsigned char TX_INTERVAL_MS[6];
   unsigned char TX_MAX_NUMBER[8];
   unsigned char TX_TOPOLOGY_INTERVAL[4];
} tmnStr;
 
/* Network structure definition */
typedef struct {
   unsigned char OPERATING_MODE[1];
   unsigned char PAN_ID[4];
   unsigned char ROLE[1];
   unsigned char CHMASK[8];
   unsigned char MAC_ADDR[16];
   unsigned char NET_ID[4];
   unsigned char NODE_NAME[10];
} nwStr;
Dans ma fonction main, j'appelle la fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
readFile(file, &firmware, &transmission, &network);
décrite ci-dessous:

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
void readFile(FILE *file, fwStr *firmware, tmnStr *transmission, nwStr *network) {
 
   /* Getting firmware structure */
   sscanf(getFileLine(file, 1), "RFB_PATH=%s", firmware->RFB_PATH);
   sscanf(getFileLine(file, 1), "POWER_LED_PATH=%s", firmware->POWER_LED_PATH);
   sscanf(getFileLine(file, 1), "BOOT_LED_PATH=%s", firmware->BOOT_LED_PATH);
   sscanf(getFileLine(file, 1), "FIRMWARE_LED_PATH=%s", firmware->FIRMWARE_LED_PATH);
   sscanf(getFileLine(file, 1), "TX_LED_PATH=%s", firmware->TX_LED_PATH);
   sscanf(getFileLine(file, 1), "RX_LED_PATH=%s", firmware->RX_LED_PATH);
 
   /* Getting transmission structure */
   sscanf(getFileLine(file, 1), "DEST_ID=%s", transmission->DEST_ID);
   sscanf(getFileLine(file, 1), "SENSORS=%s", transmission->SENSORS);
   sscanf(getFileLine(file, 1), "TX_INTERVAL_H=%s", transmission->TX_INTERVAL_H);
   sscanf(getFileLine(file, 1), "TX_INTERVAL_MS=%s", transmission->TX_INTERVAL_MS);
   sscanf(getFileLine(file, 1), "TX_MAX_NUMBER=%s", transmission->TX_MAX_NUMBER);
   sscanf(getFileLine(file, 1), "TX_TOPOLOGY_INTERVAL=%s", transmission->TX_TOPOLOGY_INTERVAL);
 
   /* Getting network structure */
   sscanf(getFileLine(file, 1), "OPERATING_MODE=%s", network->OPERATING_MODE);
   sscanf(getFileLine(file, 1), "PAN_ID=%s", network->PAN_ID);
   sscanf(getFileLine(file, 1), "ROLE=%s", network->ROLE);
   sscanf(getFileLine(file, 1), "CHMASK=%s", network->CHMASK);
   sscanf(getFileLine(file, 1), "MAC_ADDR=%s", network->MAC_ADDR);
   sscanf(getFileLine(file, 1), "NET_ID=%s", network->NET_ID);
   sscanf(getFileLine(file, 1), "NODE_NAME=%s", network->NODE_NAME);
 
/* Debug */
   printf("[%s]\n", firmware->RFB_PATH);
   printf("[%s]\n", firmware->POWER_LED_PATH);
   printf("[%s]\n", firmware->BOOT_LED_PATH);
   printf("[%s]\n", firmware->FIRMWARE_LED_PATH);
   printf("[%s]\n", firmware->TX_LED_PATH);
   printf("[%s]\n", firmware->RX_LED_PATH);
   printf("[%s]\n", transmission->DEST_ID);
   printf("[%s]\n", transmission->SENSORS);
   printf("[%s]\n", transmission->TX_INTERVAL_H);
   printf("[%s]\n", transmission->TX_INTERVAL_MS);
   printf("[%s]\n", transmission->TX_MAX_NUMBER);
   printf("[%s]\n", transmission->TX_TOPOLOGY_INTERVAL);
   printf("[%s]\n", network->OPERATING_MODE);
   printf("[%s]\n", network->PAN_ID);
   printf("[%s]\n", network->ROLE);
   printf("[%s]\n", network->CHMASK);
   printf("[%s]\n", network->MAC_ADDR);
   printf("[%s]\n", network->NET_ID);
   printf("[%s]\n", network->NODE_NAME);
}
Le problème est que je n'obtient pas les bonnes valeurs pour network->OPERATING_MODE (1250 au lieu de 1) et pour le role (C100000 au lieu de C) :

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
[/dev/ttyUSB1]
[/dev/ttyUSB2]
[/dev/ttyUSB3]
[/dev/ttyUSB4]
[/dev/ttyUSB5]
[/dev/ttyUSB6]
[0]
[45980]
[0]
[2000]
[500]
[0]
[1250]
[250]
[C100000]
[100000]
[0]
[0]
[COORD]
Si je fais un printf de OPERATING_MODE et ROLE juste après leurs sscanf respectifs, ils contiennent les bonnes valeurs, mais plus après les sscanf suivants...

Je suis un peu perdu pcq j'ai tout essayé et cette solution est l'une qui me semble la plus correcte...

Pour ceux qui veulent savoir ce que contient la fonction GetFileLine, la voici:

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
char *getFileLine(FILE *file, int skip) {
 
   char buffer[FILE_LINE_LIMIT];
 
   /* While no valid line readed */
   while(1) {
      /* Reading each line */
      fgets(buffer, sizeof(buffer), file);
 
      /* Skipping comment and blank lines */
      if(skip && (buffer[0] == '#' || buffer[0] == '\n')) {;}
      else { 
         char *line = calloc(1, strlen(buffer));
         strncpy(line, buffer, strlen(buffer));
         return line;
      }
   }
}
Un GRAND merci d'avance à ceux/celles qui auront la patience de m'aider ou du moins de me diriger vers la bonne voie ;-)

Bruno.