C++ 之 Asio 库(全面解析)
1 简介
Asio 是一个跨平台的 C++ 库,常用于网络编程、底层的 I/O 编程等 (low-level I/O),其结构框架如下:
2 使用 Asio
2.1 下载
Asio 库分为 Boost 版和 non-Boost 版,后者的下载地址为: http://think-async.com/ ,下载完成后,直接解压到合适位置即可。
2.2 配置
INCLUDEPATH += $$PWD/../../serialport/asio-1.10.8/include DEFINES += ASIO_STANDALONE
1) 使用 Qt 5.9.1,其 .pro 工程文件中,添加如下配置:注意 ASIO_STANDALONE 在 non-Boost 版本中必须带有
2)使用 VS 2015,则 ASIO_STANDALONE 配置如下所示:
2.3 代码示例
下面是一个简单的串口通讯例子,主要步骤为: 创建串口 --> 配置参数 --> 读写数据 --> 开启事件循环
#include <functional> #include "asio.hpp" #include <QDebug> using namespace asio; // 存储接收到的数据 char kBuf[16]; // 声明回调函数 void PrintBuf(); int main() { // 串口 COM1 io_service iosev; serial_port port(iosev, "COM1"); // 参数设置:波特率、流控、奇偶校验、停止位、数据位 port.set_option(serial_port::baud_rate(115200)); port.set_option(serial_port::flow_control(serial_port::flow_control::none)); port.set_option(serial_port::parity(serial_port::parity::none)); port.set_option(serial_port::stop_bits(serial_port::stop_bits::one)); port.set_option(serial_port::character_size(8)); // 向串口写数据 write(port, buffer("Hello Asio", 16)); // 从串口读数据(异步) port.async_read_some(buffer(kBuf),std::bind(PrintBuf)); // 开启事件循环 iosev.run(); } // 打印接收的数据 void PrintBuf() { qDebug() << kBuf; }
3 DB9 串口
当运行上面程序时,会发现个问题:程序先向串口 COM1, 发送 / 写入 了 "Hello Asio” 的数据,然后又去 收取 / 读出 数据,这对于一个串口而言,是不会收到数据的。
台式机后面,DB9 串口引脚的编号如下:
其中,2 --> RxD,是接收数据的管脚;3 --> TxD,是发送数据的管脚。
为了上面的程序能够成功运行,可以在运行程序之前,将 2脚 和 3脚 短接,这样,则既可以发送数据,也可以收取数据了
4 虚拟串口
如果使用笔记本的话,一般没有串口,这时有两种方案:
一是,使用 USB 转串口数据线,并安装相应的驱动,便可以和带串口的设备进行通信了;
二是,使用虚拟串口软件,创建虚拟串口,例如,Configure Virtual Serial Port Driver
再配合 串口调试工具,便可灵活的进行串口程序的调试
以上这篇C++ 之 Asio 库(全面解析)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
- 无锁编程 - 大纲
- 无锁编程(一) - Double-checked Locking
- 无锁编程(二) - 原子操作
- 我所理解的Remoting(3):创建CAO Service Factory使接口和实现相互分离
- 无锁编程(三) - 忙等待
- Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于CachingCallHandler的Bug
- 无锁编程(四) - CAS与ABA问题
- Linux Kernel CMPXCHG函数分析
- 无锁编程(五) - RCU(Read-Copy-Update)
- 无锁编程(六) - seqlock(顺序锁)
- 无锁编程(七) - 实战
- zookeeper的python客户端安装
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]
- 震撼:1分钟带你看完IC0的爆炸视频
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- (四)python3 只需3小时带你轻松入门—— 流程控制
- (五)python3 只需3小时带你轻松入门—— 逻辑运算符
- (六)python3 只需3小时带你轻松入门——循环
- (七)python3 只需3小时带你轻松入门——List与dict
- Rstudio支持可视化的Markdown编辑了?
- (八)python3 只需3小时带你轻松入门——List 与 dict 的常用操作
- (九)python3 只需3小时带你轻松入门——函数自定义
- (十)python3 只需3小时带你轻松入门——模块与包
- (十一)python3 只需3小时带你轻松入门——面向对象
- 一文读懂KEGG数据库
- (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现
- 【新手宝典】一篇博文带萌新建站并了解建站体系流程和对萌新友好的便捷方式,这篇博文很有可能是你的启蒙文
- 一种不需要敲代码的Python 画图方法
- 【一】Windows API 零门槛编程指南——MessageBox 基本使用及基础讲解
- 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”