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

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


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

环境:

系统: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 itas109
	m_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 itas109
	
	return 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
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itas109

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值