C - Внешняя структура - PullRequest
       5

C - Внешняя структура

1 голос
/ 20 октября 2019

Я использую структуру для обработки сообщений NMEA, но я не знаю что, что-то идет не так при обработке. Итак, у меня есть NMEA_parse.h:

/* GPRMC */
 #define TIME   2U
 #define LAT        4U
 #define LON        6U
 #define SPD        8U
 #define ANG        9U
 #define DATE   10U

extern struct gprmc{
    char time[10];
    char latitude[10];
    char longitude[10];
    char speed[10];
    char angle[10];
    char date[10];
}gprmc_datas;

NMEA_parse.c:

#include "NMEA_parse.h"

struct gprmc gprmc_datas;

static void fill_data (char* param_in)
{
    uint8_t i = 0U;             
    char* trunk;                
    char trunk_datas[20U][10U]; 

    trunk = strtok(param_in, ",");      
    while(trunk != NULL)
    {
        i++;        
        if(i > 20) { i = 0; }

        strcpy(trunk_datas[i],trunk);
        trunk = strtok (NULL, ",");     
    }

    if(memcmp(trunk_datas[1U],"GPRMC",6U) == 0U)
    {
        strcpy(gprmc_datas.time,trunk_datas[TIME]);
        strcpy(gprmc_datas.latitude,trunk_datas[LAT]);
        strcpy(gprmc_datas.longitude,trunk_datas[LON]);
        strcpy(gprmc_datas.date,trunk_datas[DATE]);
        strcpy(gprmc_datas.time,trunk_datas[TIME]);
    }
}

main.c:

#include <stdio.h>
#include "NMEA_parse.h"

int main(void)
{
    char *message = "$GPRMC,182127.00,A,4753.47678,N,02022.20259,E,0.837,,161019,,,A*7C\r\n";
    char *mes     = "$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A";
    proc_sentence(message);
    printf("\ntime: %s\n", gprmc_datas.time);
    printf("latitude: %s\n", gprmc_datas.latitude);
    printf("longitude: %s\n", gprmc_datas.longitude);
}

proc_sentence Функция передает данные в fill_data (), если сообщение верное (контрольная сумма и т. д.) Когда я использую mes в качестве ввода, все верно, но когда я переключаюсь на сообщение показана некоторая ненормальность, потому что результат следующий:

время: 182127,00

широта: 4753.4767802022.2025E

долгота: 02022.2025E

Есть идеи, что не так?

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

В отличие от почти любого другого SO вопроса об использовании scanf, ваш вопрос на самом деле требует решения. В конце концов, если машина написала это, машина может прочитать это, верно?

Используя конкатенацию строковых литералов в Си, я довольно близко подошел к заполнению структуры одной функцией:

  int n = sscanf( message,
          "%[^,]," 
          "%[^,]," 
          "%*[^,],%[^,]," 
          "%*[^,],%[^,]," 
          "%*[^,],%[^,]," 
          "%[^,],"    
          "%[^,],", 
          label,
          gprmc.time, 
          gprmc.latitude, 
          gprmc.longitude, 
          gprmc.speed, 
          gprmc.angle, 
          gprmc.date );

Это использует малоиспользуемый спецификатор регулярного выражения, где мы ищемне запятые %[^], разделенные запятыми. %*[^] указывает на пропуск поля.

0 голосов
/ 20 октября 2019

Если вы измените широту [10] в структуре на широту [12], также можно использовать строку «message».

...