# windowsMFC串口库源码demo **Repository Path**: zhangchaoliang/WinMFC-CSerialPort-demo ## Basic Information - **Project Name**: windowsMFC串口库源码demo - **Description**: windowsMFC串口库源码demo - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-06 - **Last Updated**: 2024-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # windowsMFC 平台串口库源码 ## 设置CSerialPort头文件 右键【CommMFC根命名空间】-【属性】-【C/C++】-【常规】-【附加包含目录】-添加CSerialPort的头文件目录 ```shell $(ProjectDir)CSerialPort\include ``` 其中 $(ProjectDir)指的是项目文件 (.vcxproj 或 .csproj) 所在的目录,而不是解决方案文件 (.sln) 所在的目录。 $(ProjectDir)所指的目录最后带有'\',所以不用在加一个'\'。 ## 添加CSerialPort源文件 右键【CommMFC根命名空间】-【添加】-【新建筛选器(命名为CSerialPort)】 右键【CSerialPort筛选器】-【添加】-【现有项】-添加CSerialPort的src目录的所需文件() 所需文件清单如下: - SerialPort.cpp - SerialPortBase.cpp - SerialPortWinBase.cpp - SerialPortInfo.cpp - SerialPortInfoBase.cpp - SerialPortInfoWinBase.cpp 注意: 需要将添加的cpp文件的预编译头设置为"不使用预编译头",如右键【serialport.cpp】-【属性】-【C/C++】-【预编译头】-【预编译头: 不使用预编译头】 如不设置会报错: ```C serialport.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"? SerialPortBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"? SerialPortWinBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"? SerialPortInfo.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"? SerialPortInfoBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"? SerialPortInfoWinBase.cpp: fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"? ``` 当然,在每个文件里加上 #include "stdafx.h" 或者加上你所使用的预编译头文件也是可以解决这个错误的。 ##在MFC中添加CSerialPort代码 ### 增加CSerialPort的必要依赖库 windows下CSerialPort必须的依赖库为setupapi.lib 右键【CommMFC根命名空间】-【属性】-【链接器】-【输入】-【附加依赖项】-添加setupapi.lib ### 增加CSerialPort的头文件、继承类、接收函数及CSerialPort实例对象 在CommMFCDlg.h文件中 - 增加CSerialPort的头文件 - CCommMFCDlg类继承CSerialPortListener - 增加接收函数onReadEvent(const char *portName, unsigned int readBufferLen) - 增加CSerialPort的实例对象 注意: 如果CCommMFCDlg不继承CSerialPortListener,调用connectReadEvent函数时会报错: ``` CSerialPort::connectReadEvent: 不能将参数 1 从CCommMFCDlg *const 转换为itas109::CSerialPortListener * ``` 头文件代码如下: ```c++ // CommMFCDlg.h : 头文件 // #pragma once // 必须添加头文件,并声明命名空间 #include "SerialPort.h" #include "SerialPortInfo.h" using namespace itas109; // CCommMFCDlg 对话框 class CCommMFCDlg : public CDialog, public CSerialPortListener // add by user,必须继承CSerialPortListener { ... private: // add by user 这个函数必须声明并实现 void onReadEvent(const char *portName, unsigned int readBufferLen); // end by user private: // add by user 定义一个或者多个串口对象 CSerialPort m_serialPort; // end by user }; ``` CPPd代码如下: ```c++ // CommMFCDlg.cpp: 实现文件 ... BOOL CCommMFCDlg::OnInitDialog() { ... // 必须有这一步,否则串口无法接收消息 m_serialPort.connectReadEvent(this); ... } // add by user // onReadEvent 函数内部怎么处理的,可以自己来实现 void CCommMFCDlg::onReadEvent(const char *portName, unsigned int readBufferLen) { if(readBufferLen > 0) { char data[1024]; int recLen = m_serialPort.readData(data,readBufferLen > 1023 ? 1023 : readBufferLen); if (recLen > 0) { data[recLen] = '\0'; CString cstr; cstr.Format(_T("OnReceive - data: %s, size: %d"), CString(data), recLen); MessageBox(LPCTSTR(cstr)); // 如果没定义MessageBox,这行可以删除 } } } // end by user ``` 注意: 目前仅写了定义一个串口对象,并添加读取消息的函数。如果定义多个串口对象,需要自行更改源码去给每个对象添加消息读取函数。 否则可能会只能发送消息,不能接收。