salut,
je suis en train de réaliser un projet utilisant un recepteur GPS.
je communique en SIRF (binaire).
je souhaite utiliser une structure pour stocker et lire les données facilement.
donc j'ai créé une structure correspondant aux données envoyées.
je copie le buffer de réception dans la structure.
pour les test, j'utilise un buffer que j'ai remplis dans le code.
voici le début de la structure :
et ce que j'y met :Code:typedef struct { unsigned char messageID; unsigned short nav_valid; unsigned short nav_type; unsigned short ext_week_number; unsigned long int time_of_week; unsigned short utc_year; unsigned char utc_month; unsigned char utc_day; ...
Code:0xA0, 0xA2, 0x00, 0x5B, 0x29, 0x00, 0x00 , 0x02 , 0x04 , 0x04 , 0xE8 , 0x1D , 0x97 , 0xA7 , 0x62 , 0x07 , 0xD4 , 0x02 , 0x06 , 0x11
voila le code :
passons le problème du au big endian(micro) et little endian (comm)Code:void parseSIRF(unsigned char* val, int len) { sirf_41* message; int i = 0; while(i + 4 < len && (val[i] != 0xA0 || val[i + 1] != 0xA2 || val[i + 2] != 0x00 || val[i + 3] != 0x5B || val[i + 4] != 0x29)) // détection du début de séquence SIRF du message 41 i++; if (i + 95 < len) { message = malloc(sizeof(sirf_41)); memcpy(message, &(val[i+4]), 91); i = message->nav_valid; } else return(0); }
j'ai plusieurs problème :
quand je teste la longeur de la structure (avec sizeof), j'obtiens 94 alors qu'elle doit faire 91 octets, d'ou viens ce problème.
mais surtout, quand je lis les champs, je suis décalé, messageID est correct, mais le reste n'est pas bon, je suis décalé, j'obtiens 0x0002 pour nav_valid au lieu de 0x0000.
le microcontroleur est un 24f08ka101, je suis en simulation.
-----