CSerialPort教程(3) - MFC中使用CSerialPort
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:
- https://github.com/itas109/CSerialPort
- https://gitee.com/itas109/CSerialPort
- https://blog.csdn.net/itas109
CSerialPort教程(3) - MFC中使用CSerialPort相关推荐
- CSerialPort教程(4) - QT中使用CSerialPort
CSerialPort教程(4) - QT中使用CSerialPort 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 CS ...
- CSerialPort教程(5) - cmake方式使用CSerialPort
CSerialPort教程(5) - cmake方式使用CSerialPort 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目 ...
- duilib进阶教程 -- 在MFC中使用duilib (1)
由于入门教程的反响还不错,因此Alberl就以直播的形式来写<进阶教程>啦,本教程的前提: 1.请先阅读<仿迅雷播放器教程> 2.要有一定的duilib基础,如果还没,请先阅读 ...
- CSerialPort教程(6) - 以第三库方式使用CSerialPort
CSerialPort教程(6) - 以第三库方式使用CSerialPort 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 ...
- CSerialPort教程(2) - CSerialPort源码简介
CSerialPort教程(2) - CSerialPort源码简介 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 CSe ...
- CSerialPort教程(1) - CSerialPort项目简介
CSerialPort教程(1) - CSerialPort项目简介 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 CSe ...
- 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 简介和缘 ...
- Scintilla 3 24在MFC中的使用 动态 静态
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Scin ...
- MFC中设备描述符DC,CDC,HDC,CClientDC总结
实际这篇文章是转的,,呵呵改成原创以便推到首页.. CClientDC 类CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC.这意味着和CCl ...
最新文章
- leetcode算法题--计算各个位数不同的数字个数
- NTP时间服务相关基础及配置文件详解
- Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写
- linux flush 保证 磁盘,linux cache介绍及控制
- 机器学习中梯度下降算法的实际应用和技巧
- POJ 3051 DFS
- Android 性能优化 之初识Java内存区域
- 为什么redis可以做分布式锁
- js和jQuery判断数组是否包含指定元素
- android中Canvas使用drawBitmap绘制图片
- MongoDB 主从架构
- Emacs Lisp程序单步调试
- [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机hash)
- php choosewxpay fail,人人商城常见问题解决方案
- 我国计算机网络事业发展,我国计算机网络事业发展很快。据中国互联网络中心的一项统计显示【逻辑判断】...
- MATLAB求解矩阵特征值的六种方法
- 包含负数的二进制补码的加减运算
- 资产证券化ABS+区块链
- PHP 手机号码运营商判断2022年最新号段
- HTML div设置菜鸟教程
热门文章
- SDL农场游戏开发 2.地图与土壤层
- 记一次阿里前端面试的具体经历(资料已更新)
- [RPG Game]简单的rpg游戏#ep1------2021.04.26
- 中国尼龙剪线市场趋势报告、技术动态创新及市场预测
- oracle 分区表转换,Oracle普通表与分区表转换
- Vue学习笔记-Router死活跳不过去子路由
- ICML2020 文章目录及下载链接
- 微信H5游戏 小说域名被屏蔽拦截之预防
- 安装TortoiseSVN时报错Could not write value {30351348-7B7D-4FCC-81B4-1E394CA267EB} to key……的解决方法
- English Learning - Day2 作业打卡 2022.12.8 周四