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:
Dans mon fichier source contenant le main, je déclare donc les trois structures suivantes:Code:
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 ma fonction main, j'appelle la fonctionCode:
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;
décrite ci-dessous:Code:readFile(file, &firmware, &transmission, &network);
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:
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); }
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...Code:
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]
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:
Un GRAND merci d'avance à ceux/celles qui auront la patience de m'aider ou du moins de me diriger vers la bonne voie ;-)Code:
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; } } }
Bruno.