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,它會解析流並呼叫相應的鉤子函式。
通常使用 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);