跳轉到內容

Khepera III 工具箱/工具箱/模組/nmea

來自華夏公益教科書

nmea 模組解析 NMEA 0183 訊息流。

// A hook to process NMEA messages
void process_message(struct sNMEAMessage *m, int withchecksum) {
    int i;
    printf("New '%s' message received\n", m->command);
    for (i = 0; i < m->argument_count; i++) {
        printf("  Argument %d: %s\n", i, m->argument[i]);
    }
}


// NMEA parser
struct sNMEAParser parser;

// Initialize a new parser
nmea_parser_init(&parser);

// Set the hook for received messages
parser.hook_process_message = process_message;

// Read and parse until there is nothing available any more
while (1) {
    len = read(filehandle, buffer, 128);  // Filehandle can be any open file or socket
    if (len < 1) {
        return;
    }
    nmea_parser_process_data(&parser, buffer, len);  // This calls the hook for each complete message received
}

nmea_parser_init 初始化一個新的 NMEA 解析器。初始化後,可以在解析器結構中設定以下鉤子函式

  • hook_process_message:每當收到完整且正確的訊息時呼叫。
  • hook_process_message_checksum_error:每當收到校驗和錯誤的完整訊息時呼叫。應丟棄此類訊息。
  • hook_process_unrecognized_char:每當收到不屬於訊息的字元時呼叫。

然後必須將資料傳遞給nmea_parser_process_data,它會解析流並呼叫相應的鉤子函式。

傳送 NMEA 訊息

[編輯 | 編輯原始碼]

通常使用 printf 直接列印相應的數值來發送 NMEA 訊息。但是,在某些情況下,您可能希望將 NMEA 訊息結構傳送為正確格式的 NMEA 訊息。這可以透過以下方式實現

// The hook to send a message.
void hook_nmea_send(const unsigned char *buffer, int len) {
	write(filehandle, buffer, len);  // filehandle is the handle of an open file or socket
}

// An NMEA message
struct sNMEAMessage message;

// When initializing the parser, set the send hook:
...
parser.hook_send = hook_nmea_send;
...

// Initialize the message and fill it with the values
nmea_message_init(&message);
message->command = "TEST"
message->argument[0] = "1017";
message->argument[1] = "944";
message->argument_count = 2;

// Send the message
nmea_parser_send(&parser, &message);
華夏公益教科書