Boost.Asio实现MFC串口通信全攻略

使用Boost.Asio实现MFC串口通信功能

Boost.Asio是一个跨平台的C++网络和底层I/O编程库,支持同步和异步操作。结合MFC框架,可以高效地实现串口通信功能。以下是如何利用Boost.Asio在MFC中实现串口功能的详细方法。

环境配置

在MFC项目中集成Boost.Asio需要以下步骤:

  1. 下载Boost库并编译(确保包含Boost.Asio和Boost.System)。
  2. 在Visual Studio中配置Boost头文件和库路径。
  3. 在项目属性中启用C++11或更高标准(/std:c++17)。
// 示例:包含必要的头文件
#include <boost/asio.hpp>
#include <boost/asio/serial_port.hpp>
#include <boost/bind.hpp>

串口类的封装

封装一个串口类SerialPort,管理串口的打开、关闭、发送和异步接收。

class SerialPort {
public:
    SerialPort(boost::asio::io_context& io)
        : m_io(io), m_port(io) {}

    bool Open(const std::string& portName, unsigned int baudRate);
    void Close();
    bool Reconnect(const std::string& portName, unsigned int baudRate);
    void Write(const std::vector<uint8_t>& data);
    void AsyncRead();

private:
    boost::asio::io_context& m_io;
    boost::asio::serial_port m_port;
    std::vector<uint8_t> m_readBuffer;

    void HandleRead(const boost::system::error_code& ec, size_t bytesRead);
};

打开串口

通过boost::asio::serial_port打开串口并配置参数。

bool SerialPort::Open(const std::string& portName, unsigned int baudRate) {
    try {
        m_port.open(portName);
        m_port.set_option(boost::asio::serial_port::baud_rate(baudRate));
        m_port.set_option(boost::asio::serial_port::flow_control(
            boost::asio::serial_port::flow_control::none));
        m_port.set_option(boost::asio::serial_port::parity(
            boost::asio::serial_port::parity::none));
        m_port.set_option(boost::asio::serial_port::stop_bits(
            boost::asio::serial_port::stop_bits::one));
        m_port.set_option(boost::asio::serial_port::character_size(8));
        return true;
    } catch (const boost::system::system_error& e) {
        TRACE("Failed to open port: %s\n", e.what());
        return false;
    }
}

异步接收数据

使用async_read实现异步接收,并通过回调函数处理数据。

void SerialPort::AsyncRead() {
    m_readBuffer.resize(1024); // 调整缓冲区大小
    m_port.async_read_some(
        boost::asio::buffer(m_readBuffer),
        boost::bind(&SerialPort::HandleRead, this,
                   boost::asio::placeholders::error,
                   boost::asio::placeholders::bytes_transferred));
}

void SerialPort::HandleRead(const boost::system::error_code& ec, size_t bytesRead) {
    if (!ec) {
        // 处理接收到的数据(例如发送到MFC界面)
        std::string data(m_readBuffer.begin(), m_readBuffer.begin() + bytesRead);
        TRACE("Received: %s\n", data.c_str());

        // 继续异步读取
        AsyncRead();
    } else {
        TRACE("Read error: %s\n", ec.message().c_str());
    }
}

发送数据

通过write同步发送数据。

void SerialPort::Write(const std::vector<uint8_t>& data) {
    try {
        boost::asio::write(m_port, boost::asio::buffer(data));
    } catch (const boost::system::system_error& e) {
        TRACE("Write error: %s\n", e.what());
    }
}

关闭与重连

关闭串口和实现重连逻辑。

void SerialPort::Close() {
    if (m_port.is_open()) {
        m_port.cancel();
        m_port.close();
    }
}

bool SerialPort::Reconnect(const std::string& portName, unsigned int baudRate) {
    Close();
    return Open(portName, baudRate);
}

在MFC中集成

在MFC对话框类中调用SerialPort功能。

// 示例:MFC对话框类成员变量
boost::asio::io_context m_io;
std::unique_ptr<SerialPort> m_serialPort;
std::thread m_ioThread;

// 初始化串口
void CMyDialog::OnInitDialog() {
    m_serialPort = std::make_unique<SerialPort>(m_io);
    if (m_serialPort->Open("COM3", 9600)) {
        m_serialPort->AsyncRead();
        m_ioThread = std::thread([this] { m_io.run(); });
    }
}

// 发送按钮事件
void CMyDialog::OnBnClickedSend() {
    std::vector<uint8_t> data = { 'H', 'e', 'l', 'l', 'o' };
    m_serialPort->Write(data);
}

// 关闭时清理资源
void CMyDialog::OnClose() {
    if (m_serialPort) m_serialPort->Close();
    if (m_ioThread.joinable()) m_ioThread.join();
    CDialogEx::OnClose();
}

注意事项

  1. 线程安全boost::asio::io_context默认单线程运行,多线程需使用io_context::strand
  2. 错误处理:检查boost::system::error_code避免崩溃。
  3. 缓冲区管理:动态调整接收缓冲区大小以适应数据量。
  4. Unicode支持:MFC中字符串转换需使用CStringACStringW

通过上述方法,可以高效地在MFC中实现基于Boost.Asio的串口通信功能。

BbS.okacop092.info/PoSt/1120_474780.HtM
BbS.okacop093.info/PoSt/1120_398075.HtM
BbS.okacop094.info/PoSt/1120_564753.HtM
BbS.okacop095.info/PoSt/1120_056658.HtM
BbS.okacop096.info/PoSt/1120_559335.HtM
BbS.okacop097.info/PoSt/1120_279304.HtM
BbS.okacop098.info/PoSt/1120_132941.HtM
BbS.okacop099.info/PoSt/1120_095065.HtM
BbS.okacop114.info/PoSt/1120_215029.HtM
BbS.okacop829.info/PoSt/1120_916952.HtM
BbS.okacop092.info/PoSt/1120_917574.HtM
BbS.okacop093.info/PoSt/1120_164048.HtM
BbS.okacop094.info/PoSt/1120_178714.HtM
BbS.okacop095.info/PoSt/1120_966757.HtM
BbS.okacop096.info/PoSt/1120_363609.HtM
BbS.okacop097.info/PoSt/1120_921230.HtM
BbS.okacop098.info/PoSt/1120_822826.HtM
BbS.okacop099.info/PoSt/1120_263236.HtM
BbS.okacop114.info/PoSt/1120_866018.HtM
BbS.okacop829.info/PoSt/1120_367934.HtM
BbS.okacop092.info/PoSt/1120_333608.HtM
BbS.okacop093.info/PoSt/1120_577680.HtM
BbS.okacop094.info/PoSt/1120_228476.HtM
BbS.okacop095.info/PoSt/1120_444591.HtM
BbS.okacop096.info/PoSt/1120_393905.HtM
BbS.okacop097.info/PoSt/1120_353896.HtM
BbS.okacop098.info/PoSt/1120_883466.HtM
BbS.okacop099.info/PoSt/1120_025094.HtM
BbS.okacop114.info/PoSt/1120_402258.HtM
BbS.okacop829.info/PoSt/1120_340860.HtM
BbS.okacop092.info/PoSt/1120_322500.HtM
BbS.okacop093.info/PoSt/1120_377481.HtM
BbS.okacop094.info/PoSt/1120_957974.HtM
BbS.okacop095.info/PoSt/1120_426327.HtM
BbS.okacop096.info/PoSt/1120_716534.HtM
BbS.okacop097.info/PoSt/1120_874296.HtM
BbS.okacop098.info/PoSt/1120_315388.HtM
BbS.okacop099.info/PoSt/1120_741251.HtM
BbS.okacop114.info/PoSt/1120_417655.HtM
BbS.okacop829.info/PoSt/1120_078604.HtM
BbS.okacop092.info/PoSt/1120_636497.HtM
BbS.okacop093.info/PoSt/1120_987876.HtM
BbS.okacop094.info/PoSt/1120_518138.HtM
BbS.okacop095.info/PoSt/1120_278110.HtM
BbS.okacop096.info/PoSt/1120_180464.HtM
BbS.okacop097.info/PoSt/1120_377652.HtM
BbS.okacop098.info/PoSt/1120_117764.HtM
BbS.okacop099.info/PoSt/1120_182802.HtM
BbS.okacop114.info/PoSt/1120_347903.HtM
BbS.okacop829.info/PoSt/1120_347530.HtM
BbS.okacop000.info/PoSt/1120_938797.HtM
BbS.okacop001.info/PoSt/1120_676359.HtM
BbS.okacop002.info/PoSt/1120_847790.HtM
BbS.okacop003.info/PoSt/1120_815632.HtM
BbS.okacop004.info/PoSt/1120_565278.HtM
BbS.okacop005.info/PoSt/1120_676876.HtM
BbS.okacop006.info/PoSt/1120_715743.HtM
BbS.okacop007.info/PoSt/1120_985950.HtM
BbS.okacop008.info/PoSt/1120_146921.HtM
BbS.okacop009.info/PoSt/1120_626905.HtM
BbS.okacop000.info/PoSt/1120_128448.HtM
BbS.okacop001.info/PoSt/1120_081340.HtM
BbS.okacop002.info/PoSt/1120_660333.HtM
BbS.okacop003.info/PoSt/1120_551692.HtM
BbS.okacop004.info/PoSt/1120_285137.HtM
BbS.okacop005.info/PoSt/1120_552015.HtM
BbS.okacop006.info/PoSt/1120_408877.HtM
BbS.okacop007.info/PoSt/1120_764134.HtM
BbS.okacop008.info/PoSt/1120_505158.HtM
BbS.okacop009.info/PoSt/1120_147831.HtM
BbS.okacop000.info/PoSt/1120_316075.HtM
BbS.okacop001.info/PoSt/1120_022546.HtM
BbS.okacop002.info/PoSt/1120_724550.HtM
BbS.okacop003.info/PoSt/1120_832142.HtM
BbS.okacop004.info/PoSt/1120_793797.HtM
BbS.okacop005.info/PoSt/1120_002896.HtM
BbS.okacop006.info/PoSt/1120_482918.HtM
BbS.okacop007.info/PoSt/1120_283471.HtM
BbS.okacop008.info/PoSt/1120_158282.HtM
BbS.okacop009.info/PoSt/1120_110707.HtM

#牛客AI配图神器#

全部评论

相关推荐

10-21 00:37
已编辑
门头沟学院 C++
小浪_Coding:你问别人,本来就是有求于人,别人肯定没有义务免费回答你丫, 有点流量每天私信可能都十几,几十条的,大家都有工作和自己的事情, 付费也是正常的, 就像你请别人搭把手, 总得给人家买瓶水喝吧
点赞 评论 收藏
分享
09-25 11:39
已编辑
北京航空航天大学 Java
我的代码出BUG了:@美团@腾讯@字节跳动@阿里巴巴。你们好好看看吧,你们就挂我吧,到时候被人家鸽穿还得录取我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务