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 配置
1) 使用 Qt 5.9.1,其 .pro 工程文件中,添加如下配置:注意 ASIO_STANDALONE 在 non-Boost 版本中必须带有
/include DEFINES += ASIO_STANDALONE
2)使用 VS 2015,则 ASIO_STANDALONE 配置如下所示:

2.3 代码示例
下面是一个简单的串口通讯例子,主要步骤为: 创建串口 --> 配置参数 --> 读写数据 --> 开启事件循环
#include <functional>
#include "asio.hpp"
#include <QDebug>
using namespace asio;
// 存储接收到的数据
];
// 声明回调函数
void PrintBuf();
int main()
{
// 串口 COM1
io_service iosev;
serial_port port(iosev, "COM1");
// 参数设置:波特率、流控、奇偶校验、停止位、数据位
port.set_option(serial_port::baud_rate());
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());
// 向串口写数据
write(port, buffer());
// 从串口读数据(异步)
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 库的更多相关文章
- VS2008下编译BOOST 1.39的ASIO库
由于全部编译BOOST库需要的时间太长,而且耗费空间,况且我只需要用ASIO库,所以就没有必要全部编译了. boost库到www.boost.org上下载. 编译很简单,假设你的boost存放的目录是 ...
- c++ boost asio库初学习
前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考. 同步server: // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します. ...
- Mac OS 使用asio库
下载地址:http://sourceforge.net/projects/asio/files/asio/1.12.2%20%28Stable%29/ 本人下载的版本:asio-1.12.2 1,本人 ...
- Mac OS 安装 独立的asio库
先安装boost,见前文,然后上官网下载不带boost的asio,版本为:asio-1.12.2 cd到下载的库目录,配置 ./configure --with-boost="boost的安 ...
- ASIO库使用注意事项
1. 使用 io_service::work 实现 io_service 无任务时不退出 正常情况下向io_service抛任务,它执行完成后就会自动退出,而要实现那种chromium那种的循环队列, ...
- [Boost基础]并发编程——asio网络库——同步socket处理
网络通信简述 asio库支持TCP,UDP和ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好的封装了原始的Berkeley Socket API, ...
- [Boost基础]并发编程——asio网络库——定时器deadline_timer
asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求使用多线程和锁定,有些的避免了多线程编程带来的诸多有害副作用(如条件竞争 ...
- 网络库Asio交叉编译(Linux生成ARM)
1. Asio是一个跨平台的C++库,用于网络和底层I/O编程.Asio使用先进的C++方式提供了一系列的异步模型 2. 官方网址:http://think-async.com 3. 由于Asio库 ...
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
随机推荐
- sleep()方法和wait()方法之间有什么差异?
sleep()方法用被用于让程序暂停指定的时间,而wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者nofifyAl()方法 主要的区别是,wait()释放 ...
- SICP-1.6-高阶函数
高阶函数 将函数作为参数 例如 def sum_naturals(n): total, k = 0, 1 while k <= n: total, k = total + k, k + 1 re ...
- Log4j中配置日志文件相对路径
方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...
- MyElipse配置
DK1.6.0+Tomcat6.0+myEclipse的安装配置 C:\Users\Administrator\AppData\Local\Genuitec\Pulse Explorer JDK1.6 ...
- 【LeetCode】190. Reverse Bits
题目: Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented ...
- 【Android Developers Training】 66. 添加动画
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- js原生获取className&多选一
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 探索Windows命令行系列(7):通过命令编译C#类和Java类
1.编译 C# 类 1.1.C# 编译工具 1.2.编译一个 C# 类 1.3.编译多个 C# 类 2.编译 Java 类 2.1.Java 编译工具 2.2.编译 Java 类 3.组合命令符 4. ...
- [图形学] Chp17 OpenGL光照和表面绘制函数
这章学了基本光照模型,物体的显示受到以下效果影响:全局环境光,点光源(环境光漫反射分量,点光源漫反射分量,点光源镜面反射分量),材质系数(漫反射系数,镜面反射系数),自身发光,雾气效果等.其中点光源有 ...
- VB6之Mandelbrot集
Mandelbrot真是上帝之作,数学之美最直观的表现. 围观wiki和百科(百度百科)上关于Mandelbrot的解释至今仍是不能理解,没办法我高数实在学得不好. 搜素到园友用F#写的一篇实现代码, ...