boost多线程与mavlink协议结合实现消息收发

 本文将实现boost库创建多线程,利用mavlink协议进行数据链消息打包、解包,解放了很多数据解析的工作,不得不佩服mavlink协议功能的强大。

boost创建多线程

/****************************************************************************************************************** 文件名称:main.cpp* 描述: 本文旨在创建一个数据链标准程序.以mavlink协议v2版本为基准,实现数据链层面的通信。* 作者:xhome* 时间:2020/1/15****************************************************************************************************************/#include "datalink_base.h"using namespace std;
using namespace boost;config_t config;int main() {std::cout << "mavlink_datalink start ok." << std::endl;//定义线程组,管理线程boost::thread_group  threadGroup;//串口设备名称.config.uart_name = "/dev/ttyUSB0";config.baud = 1;threadGroup.create_thread(thread_send_msg);threadGroup.create_thread(thread_recv_msg);//阻塞等待.threadGroup.join_all();return 0;
}

头文件定义

/*********************************************************************************************************************** datalink_base.h* 描述:基本全局头文件,存储全局变量申明等* 作者:xhome* 时间:2020/1/15*********************************************************************************************************************/#ifndef MAVLINK_DATALINK_DATALINK_BASE_H
#define MAVLINK_DATALINK_DATALINK_BASE_H#include <iostream>
#include <string>
#include <boost/thread.hpp>
#include <boost/thread/lock_factories.hpp>
#include <boost/thread/condition.hpp>using namespace std;//定义配置文件
typedef struct config_ {string uart_name; //串口名称.int baud; //波特率选择值.
}config_t;//配置文件.
extern config_t config;//消息收发线程.
extern  void thread_recv_msg(void);
extern  void thread_send_msg(void);#endif //MAVLINK_DATALINK_DATALINK_BASE_H

串口类定义

/********************************************************************************************************* SerialPort.hpp 自定义出串口类,运行平台linux操作系统.* 描述:实现串口的初始化.* 作者:xhome* 时间:2020/1/10*******************************************************************************************************/#ifndef MAVLINK_DATALINK_SERIALPORT_HPP
#define MAVLINK_DATALINK_SERIALPORT_HPP#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include "mavlink.h"using namespace std;//串口操作类.
class SerialPort {public:SerialPort(string uart_name, speed_t baudrate){uartName = uart_name;speedBaud = baudrate;}public:/*** 功能: 打开设备文件* 参数: 无* 返回值: 文件描述符.* 作者:xhome* 时间:2020/1/10*/int open_serial_dev() {int fd_ = 0;if(uartName.length() == 0){cout << "devName is NULL." << endl;return -1;}fd_ = open(uartName.c_str(), O_RDWR);if(fd_ < 0){fd = fd_;cout << uartName << " is opened failed." << endl;return -1;}else{fd = fd_;cout << uartName << " is opened ok." << endl;}return fd_;}int  close_serial()//关闭串口设备文件.{close(fd);}/*** 功能: 串口初始化* 参数: fd  文件描述符* 作者:  xhome* 时间:  2020/1/10*/void serial_init() //串口初始化.{if(fd < 0){cout << "serial_init failed ." << endl;return;}struct termios options;tcgetattr(fd, &options);                //读取终端参数options.c_cflag |= ( CLOCAL | CREAD );  //忽略调试解调器线路状态,使用接受器options.c_cflag &= ~CSIZE;              //清目前字符长度options.c_cflag &= ~CRTSCTS;            //不实用RTS/CTS控制流options.c_cflag |= CS8;                 //字符长度设置为8options.c_cflag &= ~CSTOPB;             //设置一个标志位options.c_iflag |= IGNPAR;              //允许输入奇偶校验options.c_iflag &= ~(ICRNL | IXON);     //回车不转换为换行,不允许输入时对XON/XOFF>options.c_oflag = 0;options.c_lflag = 0;options.c_cflag |= CBAUDEX; //设置特定波特率的标志位.cfsetispeed(&options, speedBaud);         //设置波特率为115200cfsetospeed(&options, speedBaud);tcsetattr(fd,TCSANOW,&options);         //设置终端参数cout << "serial_init ok." << endl;}/*** 读取串口消息.* 参数:message  mavlink 标准消息结构体.* 作者:xhome* 时间:2020/1/15*/int  read_message(mavlink_message_t &message){int result = 0;uint8_t ch;mavlink_status_t status;uint8_t msgReceived = false;result = read(fd, &ch, 1);if(result > 0){msgReceived = mavlink_parse_char(MAVLINK_COMM_0, ch, &message, &status);// check for dropped packetsif ( (lastStatus.packet_rx_drop_count != status.packet_rx_drop_count) ){printf("ERROR: DROPPED %d PACKETS\n", status.packet_rx_drop_count);unsigned char v= ch;fprintf(stderr,"%02x ", v);}lastStatus = status;}return msgReceived;}/*** 发送消息到串口.* 参数:buffer  发送的消息*      len     消息长度* 返回值:成功0, 出错-1*/int send_msg_to_uart(uint8_t * buffer, uint16_t len){if(len < 0 || len > 512){return -1;}for(int i = 0; i < len; i++){write(fd, &buffer[i], 1);}return 0;}public:string  uartName; //设备名称speed_t speedBaud; //设备波特率int fd; //文件描述符.mavlink_status_t lastStatus;};#endif //MAVLINK_EXAMPLE_SERIALPORT_HPP

数据链发送线程

/************************************************************************************************* thread_recv_msg.cpp* 描述:消息接收线程,从串口获取消息* 作者:xhome* 时间:2020/1/15***********************************************************************************************/
#include "datalink_base.h"
#include "SerialPort.hpp"
#include "mavlink.h"using namespace std;
using namespace boost;void thread_send_msg(void){bool success;               // receive success flagbool received_all = false;  // receive only one message//   Time_Stamps this_timestamps;mavlink_message_t msg ;mavlink_mission_count_t  mission_count; //mavlink定义任务数量消息uint8_t buffer[512] = {};uint16_t nbytes = 0;uint8_t system_id = 10;uint8_t component_id = 100;std::cout << "thread_send_msg start ok." << endl;//串口初始化.SerialPort serialPort(config.uart_name, B115200);//打开串口.serialPort.open_serial_dev();//串口初始化.serialPort.serial_init();mission_count.target_component = 0;while(1){mission_count.count = 10;mission_count.target_system = 2;mission_count.target_component++;mission_count.mission_type = 3;mavlink_msg_mission_count_encode(system_id, component_id, &msg, &mission_count);nbytes = mavlink_msg_to_send_buffer(buffer, &msg);//串口发送消息.serialPort.send_msg_to_uart(buffer, nbytes);cout << "send msg frame ok." << endl;sleep(1);}}

数据链接受线程

/************************************************************************************************* thread_recv_msg.cpp* 描述:消息接收线程,从串口获取消息* 作者:xhome* 时间:2020/1/15***********************************************************************************************/
#include "datalink_base.h"
#include "SerialPort.hpp"
#include "mavlink.h"
#include <boost/lexical_cast.hpp>using namespace std;
using namespace boost;void read_messages(SerialPort * serial_port);void thread_recv_msg(void){std::cout << "thread_recv_msg start ok." << endl;bool success;               // receive success flagbool received_all = false;  // receive only one message// Time_Stamps this_timestamps;std::cout << "thread_send_msg start ok." << endl;//串口初始化.SerialPort serialPort(config.uart_name, B115200);//打开串口.serialPort.open_serial_dev();//串口初始化.serialPort.serial_init();while(1){read_messages(&serialPort);}
}void read_messages(SerialPort * serial_port){bool success = false;bool received_all = false;int sysid;int compid;mavlink_heartbeat_t heartbeat;mavlink_mission_count_t missionCount;// Blocking wait for new datawhile ( !received_all) {mavlink_message_t message;success = serial_port->read_message(message);if (success) {// Store message sysid and compid.// Note this doesn't handle multiple message sources.sysid = message.sysid;compid = message.compid;cout << "sysid:" << sysid << " compid:" << compid << endl;// Handle Message IDswitch (message.msgid) {case MAVLINK_MSG_ID_HEARTBEAT://printf("MAVLINK_MSG_ID_HEARTBEAT\n");mavlink_msg_heartbeat_decode(&message, &heartbeat);//   heartbeat = get_time_usec();break;case MAVLINK_MSG_ID_MISSION_COUNT:mavlink_msg_mission_count_decode(&message, &missionCount);cout << "mission_type:" << boost::lexical_cast<std::string>((int)missionCount.mission_type)<< " count:" << boost::lexical_cast<std::string>(missionCount.count)<< " target_system:" <<  boost::lexical_cast<std::string>((int)missionCount.target_system)<< " target_component:" << boost::lexical_cast<std::string>((int)missionCount.target_component) << endl;break;}}}return;
}

实验结果

6005.boost多线程与mavlink协议结合实现消息收发相关推荐

  1. 微信协议交换、消息收发

    为什么80%的码农都做不了架构师?>>>    微信技术总监解读微信架构的秘密 视频:http://djt.qq.com/video/9 PPT: http://djt.qq.com ...

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

    mavlink 自定义消息编程 紧接着上一篇的操作方法,根据自定义的xml生成基于mavlink协议形式的消息.将其添加到工程中,并且调用起来的示例demo代码如下: 将生成自定义消息目录拷贝到工程下 ...

  3. Boost多线程-替换MFC线程

    Mfc的多线程看起来简单,可以把线程直接压入向量,由系统类似进行调配,其实在内存的处理问题上留下了漏洞.在新线程里面载入大量流,会导致内存泄露. 方便之处:直接使用结构体传入函数参数,供函数使用. 使 ...

  4. boost多线程使用简例

    原文链接:http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html C++ Boost Thread 编程指南 转自cnblog: ...

  5. 9 C++ Boost 多线程,线程同步

    线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死 ...

  6. mavlink协议从入门到放弃(二)

    mavlink协议从入门到放弃(二) 姿态消息帧 GPS消息帧 mavlink校验位的计算 因为这个项目没有说要完全移植mavlink协议,所以只是提取了有用的信息包成mavlink协议然后发给上位机 ...

  7. Java多线程socket网络协议传输

    Java和大数据系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等 ...

  8. Mavlink协议概要

    转:http://blog.csdn.net/luckpl/article/details/52608868#mavlink协议简介 Mavlink协议简介 Mavlink协议简介 一Mavlink协 ...

  9. mavlink协议_MAVLink学习之路03_XML中定义MSG并生成C代码

    说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 一.写在前面 如果你前面两篇文章掌握了,说明你已经入门了. ...

最新文章

  1. 释疑の语法Unpackpack
  2. db2错误: SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=5, TABLEID=30, COLNO=149, DRIVER=3.50.152
  3. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - A. 组队
  4. 牛客网 --java问答题
  5. 25 Refs转发机制与在高阶组件中的使用
  6. Android RecyclerView实现九宫格效果
  7. 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...
  8. 我很多文章都有建议大伙不要轻易去创业
  9. 从源码角度看ContentProvider
  10. 688561,安全新代码!
  11. asp.net获取浏览器的唯一标识_vue单页面应用如何在微信浏览器里进行网页授权获取用户信息
  12. 关于C#语言中的集合
  13. 精简版NovoNotes 3DX for Mac - 顶尖3D音频制作插件
  14. hadoop2.x配合ZooKeeper集群环境搭建
  15. 经典:5种常见的数据分析方法
  16. kobo glo安装koreader(刷ksm后)
  17. Java练手项目实战——五子棋游戏实现思路及源码
  18. Datewhale组队学习——深度学习推荐系统(1)
  19. 【从零学习openCV】IOS7根据人脸检测
  20. xss labs 挑战之旅

热门文章

  1. 调用软键盘_Android 支持拖动、缩放的自定义软键盘
  2. can connect mysql not server_MySQL -- 配置文件my.cnf 的详细说明
  3. 算法提高 陶陶摘苹果2(java)
  4. c语言做一个抽奖小程序,小程序插件使用- 抽奖助手
  5. 西部数码 php.ini,如何修改PHP的memory_limit限制
  6. Java 算法 特殊的数字四十
  7. matlab if 中的等于符号,if 嵌套里的逻辑选择语句出现符号函数不能向逻辑运算转换...
  8. python生成一圈数包裹一圈数的数组
  9. 开关电源磁性元件理论及设计pdf_2020年开关电源需求活跃 通讯运营商已多轮集采...
  10. Linux CA证书与https讲解