当前位置: 代码迷 >> 综合 >> 6003.mavlink协议自定义消息编程
  详细解决方案

6003.mavlink协议自定义消息编程

热度:15   发布时间:2024-01-24 22:13:28.0

mavlink 自定义消息编程

 紧接着上一篇的操作方法,根据自定义的xml生成基于mavlink协议形式的消息。将其添加到工程中,并且调用起来的示例demo代码如下:
  • 将生成自定义消息目录拷贝到工程下
#include <iostream>
#include <mavlink.h>
#include <string>
//#include "SerialPort.hpp"using namespace std;int main(int argc , char * argv[]) {std::cout << "Hello mavlink !" << std::endl;uint8_t system_id = 1;uint8_t component_id = 1;//定义mavlink标准消息结构体mavlink_message_t msg;uint8_t buffer[MAVLINK_MAX_PACKET_LEN] = {};//上传航线包,初始化信息1mavlink_upload_route_t packet_in = {963497464,963497672,963497880,1,1};//上传航线包,初始化信息2mavlink_upload_route_t packet1, packet2;memset(&packet1, 0, sizeof(packet1));packet1.lon = packet_in.lon;packet1.lat = packet_in.lat;packet1.alt = packet_in.alt;packet1.route_id = packet_in.route_id;packet1.point_id = packet_in.point_id;memset(&packet2, 0, sizeof(packet2));//将packet1 打包成 msg 格式, 加上mavlink协议头. 编码mavlink_msg_upload_route_encode(system_id, component_id, &msg, &packet1);//将mavlink协议包转换为自定义消息包, 解码mavlink_msg_upload_route_decode(&msg, &packet2);MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);//输出packet2cout << "route_id:" << to_string(packet2.route_id)  << " point_id:" << to_string(packet2.point_id) << " lon:" << packet2.lon << " lat:" << packet2.lat << " alt:" << packet2.alt << endl;//将标准协议格式包转换成buffer字节流形式存储在数组中,准备好进行发送,可以通过串口或者网络mavlink_msg_to_send_buffer(buffer, &msg);//输出buffer与协议表进行对比.for (int j = 0; j < MAVLINK_MAX_PACKET_LEN; ++j) {printf("%x ", buffer[j]);if(j!=0  && j%100 == 0){putchar(10);}}putchar(10);//程序输出数据如下,f4,b8即为校验码 //fd e 0 0 0 1 1 c 0 0 f8 cd 6d 39 c8 ce 6d 39 98 cf 6d 39 1 1 f4 b8//1 如果是网络发送,参考此形式进行发送即可.当然这之前需要一些网络初始化代码,本文略.//bytes_sent = sendto(sock, buf, len, 0, (struct sockaddr*)&gcAddr, sizeof (struct sockaddr_in));//2 如果是串口发送,那么采用以下形式即可.//write() 写串口即可return 0;
}
  • mavlink协议帧
    在这里插入图片描述