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);