1. 程式人生 > >C++ 之 Asio 庫

C++ 之 Asio 庫

接收 dal 事件 using target pro std code fine

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 版本中必須帶有

INCLUDEPATH += $$PWD/../../serialport/asio-1.10
.8/include DEFINES += ASIO_STANDALONE

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 庫