跳转到内容

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);
华夏公益教科书