CSerialPort教程(3) - MFC中使用CSerialPort


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

文章目录

  • CSerialPort教程(3) - MFC中使用CSerialPort
    • 前言
    • 1. 新建基于对话框的MFC项目
    • 2. 设置CSerialPort头文件
    • 3. 添加CSerialPort源文件
    • 4. 增加CSerialPort的必要依赖库
    • 5. 在MFC中添加CSerialPort代码
      • 5.1 增加CSerialPort的头文件、继承类、接收函数及CSerialPort实例对象
      • 5.2 增加串口的相关实现代码
    • 6. 结果

环境:

系统:windows 10 64位
编译器:Visual Studio Community 2017

前言

CSerialPort项目是基于C++的轻量级开源跨平台串口类库,用于实现跨平台多操作系统的串口读写。

CSerialPort项目的开源协议自 V3.0.0.171216 版本后采用GNU Lesser General Public License v3.0

为了让开发者更好的使用CSerialPort进行开发,特编写基于4.x版本的CSerialPort教程系列。

本文将介绍如何在MFC中使用CSerialPort。

CSerialPort项目地址:

  • https://github.com/itas109/CSerialPort
  • https://gitee.com/itas109/CSerialPort

MFC完整示例程序地址:

  • https://github.com/itas109/CSerialPort/tree/master/examples/CommMFC
  • https://gitee.com/itas109/CSerialPort/tree/master/examples/CommMFC

1. 新建基于对话框的MFC项目

新建一个基于对话框的MFC项目,解决方案名称为CommMFC

在CommMFC解决方案目录下载CSerialPort源码

$ cd CommMFC
$ git clone https://github.com/itas109/CSerialPort

目录结构如下:

D:/CommMFC $ tree
.
+--- CommMFC
|   +--- CommMFC.cpp
|   +--- CommMFC.h
|   +--- CommMFC.rc
|   +--- CommMFC.vcxproj
|   +--- CommMFCDlg.cpp
|   +--- CommMFCDlg.h
|   +--- framework.h
|   +--- pch.cpp
|   +--- pch.h
|   +--- res
|   |   +--- CommMFC.ico
|   |   +--- CommMFC.rc2
|   +--- Resource.h
|   +--- targetver.h
+--- CommMFC.sln
+--- CSerialPort
|   +--- include
|   |   +--- CSerialPort
|   |   |   +--- SerialPort.h
|   |   |   +--- SerialPortInfo.h
|   +--- src
|   |   +--- SerialPort.cpp
|   |   +--- SerialPortBase.cpp
|   |   +--- SerialPortInfo.cpp
|   |   +--- SerialPortInfoBase.cpp
|   |   +--- SerialPortInfoWinBase.cpp
|   |   +--- SerialPortWinBase.cpp

2. 设置CSerialPort头文件

右键【CommMFC根命名空间】-【属性】-【C/C++】-【常规】-【附加包含目录】-添加CSerialPort的头文件目录

D:\CommMFC\CSerialPort\include

$(ProjectDir)\..\CSerialPort\include

3. 添加CSerialPort源文件

右键【CommMFC根命名空间】-【添加】-【新建筛选器(命名为CSerialPort)】

右键【CSerialPort筛选器】-【添加】-【现有项】-添加CSerialPort的src目录的所需文件()

所需文件清单如下:

  • SerialPort.cpp
  • SerialPortBase.cpp
  • SerialPortWinBase.cpp
  • SerialPortInfo.cpp
  • SerialPortInfoBase.cpp
  • SerialPortInfoWinBase.cpp

注意:

需要将添加的cpp文件的预编译头设置为"不使用预编译头",如右键【serialport.cpp】-【属性】-【C/C++】-【预编译头】-【预编译头: 不使用预编译头】

如不设置会报如下错误:

serialport.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"
SerialPortBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"
SerialPortWinBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"
SerialPortInfo.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"
SerialPortInfoBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"
SerialPortInfoWinBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"

4. 增加CSerialPort的必要依赖库

windows下CSerialPort必须的依赖库为setupapi.lib

右键【CommMFC根命名空间】-【属性】-【链接器】-【输入】-【附加依赖项】-添加setupapi.lib

5. 在MFC中添加CSerialPort代码

5.1 增加CSerialPort的头文件、继承类、接收函数及CSerialPort实例对象

CommMFCDlg.h文件中

  • 增加CSerialPort的头文件
  • CCommMFCDlg类继承public has_slots<>
  • 增加接收函数OnReceive()
  • 增加CSerialPort的实例对象

代码如下:

// CommMFCDlg.h: 头文件#pragma once// add by itas109
#include "CSerialPort/SerialPort.h"
#include "CSerialPort/SerialPortInfo.h"
using namespace itas109;
// end by itas109// CCommMFCDlg 对话框
class CCommMFCDlg : public CDialogEx, public has_slots<> // add by itas109
{...// add by itas109
private:void OnReceive();// end by itas109// add by itas109
private:CSerialPort m_serialPort;// end by itas109
}

注意:
如果CCommMFCDlg不继承has_slots的话,会报如下错误

cserialport\include\cserialport\sigslot.h(487): error C2039: "signal_connect": 不是"CCommMFCDlg"的成员

5.2 增加串口的相关实现代码

CommMFCDlg.cpp文件增加

  • CCommMFCDlg::OnInitDialog()中增加CSerialPort的测试代码
  • 增加OnReceive函数的实现
// CommMFCDlg.cpp: 实现文件
...BOOL CCommMFCDlg::OnInitDialog()
{...// TODO: 在此添加额外的初始化代码// add by itas109m_serialPort.readReady.connect(this, &CCommMFCDlg::OnReceive);m_serialPort.init("COM2");m_serialPort.open();if (m_serialPort.isOpened()){m_serialPort.writeData("itas109", 7);}else{MessageBox(_T("open failed"));}// end by itas109return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}// add by itas109
void CCommMFCDlg::OnReceive()
{char str[1024];int recLen = m_serialPort.readAllData(str);if (recLen > 0){str[recLen] = '\0';CString cstr;cstr.Format(_T("OnReceive - data: %s, size: %d"), CString(str), recLen);MessageBox(LPCTSTR(cstr));}
}
// end by itas109

6. 结果

代码中的COM2对应的串口为RS232环回测试硬件,因此对应的结果为程序启动后,初始化并打开串口COM2,发送数据itas09,随后弹框提示收到数据(如OnReceive - data: i, size: 1)


License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎

如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033


Reference:

  1. https://github.com/itas109/CSerialPort
  2. https://gitee.com/itas109/CSerialPort
  3. https://blog.csdn.net/itas109

CSerialPort教程(3) - MFC中使用CSerialPort相关推荐

  1. CSerialPort教程(4) - QT中使用CSerialPort

    CSerialPort教程(4) - QT中使用CSerialPort 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 CS ...

  2. CSerialPort教程(5) - cmake方式使用CSerialPort

    CSerialPort教程(5) - cmake方式使用CSerialPort 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目 ...

  3. duilib进阶教程 -- 在MFC中使用duilib (1)

    由于入门教程的反响还不错,因此Alberl就以直播的形式来写<进阶教程>啦,本教程的前提: 1.请先阅读<仿迅雷播放器教程> 2.要有一定的duilib基础,如果还没,请先阅读 ...

  4. CSerialPort教程(6) - 以第三库方式使用CSerialPort

    CSerialPort教程(6) - 以第三库方式使用CSerialPort 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 ...

  5. CSerialPort教程(2) - CSerialPort源码简介

    CSerialPort教程(2) - CSerialPort源码简介 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 CSe ...

  6. CSerialPort教程(1) - CSerialPort项目简介

    CSerialPort教程(1) - CSerialPort项目简介 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 CSe ...

  7. MFC中快速应用OpenCV(转)

    转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...

  8. Scintilla 3 24在MFC中的使用 动态 静态

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Scin ...

  9. MFC中设备描述符DC,CDC,HDC,CClientDC总结

    实际这篇文章是转的,,呵呵改成原创以便推到首页.. CClientDC 类CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC.这意味着和CCl ...

最新文章

  1. leetcode算法题--计算各个位数不同的数字个数
  2. NTP时间服务相关基础及配置文件详解
  3. Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写
  4. linux flush 保证 磁盘,linux cache介绍及控制
  5. 机器学习中梯度下降算法的实际应用和技巧
  6. POJ 3051 DFS
  7. Android 性能优化 之初识Java内存区域
  8. 为什么redis可以做分布式锁
  9. js和jQuery判断数组是否包含指定元素
  10. android中Canvas使用drawBitmap绘制图片
  11. MongoDB 主从架构
  12. Emacs Lisp程序单步调试
  13. [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机hash)
  14. php choosewxpay fail,人人商城常见问题解决方案
  15. 我国计算机网络事业发展,我国计算机网络事业发展很快。据中国互联网络中心的一项统计显示【逻辑判断】...
  16. MATLAB求解矩阵特征值的六种方法
  17. 包含负数的二进制补码的加减运算
  18. 资产证券化ABS+区块链
  19. PHP 手机号码运营商判断2022年最新号段
  20. HTML div设置菜鸟教程

热门文章

  1. SDL农场游戏开发 2.地图与土壤层
  2. 记一次阿里前端面试的具体经历(资料已更新)
  3. [RPG Game]简单的rpg游戏#ep1------2021.04.26
  4. 中国尼龙剪线市场趋势报告、技术动态创新及市场预测
  5. oracle 分区表转换,Oracle普通表与分区表转换
  6. Vue学习笔记-Router死活跳不过去子路由
  7. ICML2020 文章目录及下载链接
  8. 微信H5游戏 小说域名被屏蔽拦截之预防
  9. 安装TortoiseSVN时报错Could not write value {30351348-7B7D-4FCC-81B4-1E394CA267EB} to key……的解决方法
  10. English Learning - Day2 作业打卡 2022.12.8 周四