專業(yè)網(wǎng)站定制公司新開店鋪怎么做推廣
CSerialPort教程4.3.x (3) - CSerialPort在MFC中的使用
環(huán)境:
系統(tǒng):windows 10 64位
編譯器:Visual Studio 2008
前言
CSerialPort項(xiàng)目是一個(gè)基于C/C++的輕量級(jí)開源跨平臺(tái)串口類庫,可以輕松實(shí)現(xiàn)跨平臺(tái)多操作系統(tǒng)的串口讀寫,同時(shí)還支持C#, Java, Python, Node.js等。
CSerialPort項(xiàng)目的開源協(xié)議自 V3.0.0.171216 版本后采用GNU Lesser General Public License v3.0
為了讓開發(fā)者更好的使用CSerialPort進(jìn)行開發(fā),特編寫基于4.3.x版本的CSerialPort教程系列。
CSerialPort項(xiàng)目地址:
- 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. 新建基于對(duì)話框的MFC項(xiàng)目
新建一個(gè)基于對(duì)話框的MFC項(xiàng)目,解決方案名稱為CommMFC
在CommMFC解決方案目錄下載CSerialPort源碼
$ cd CommMFC
$ git clone https://github.com/itas109/CSerialPort
目錄結(jié)構(gòu)如下:
D:/CommMFC $ tree
.
+--- CommMFC
| +--- CommMFC.aps
| +--- CommMFC.cpp
| +--- CommMFC.h
| +--- CommMFC.rc
| +--- CommMFC.vcproj
| +--- CommMFCDlg.cpp
| +--- CommMFCDlg.h
| +--- ReadMe.txt
| +--- res
| | +--- CommMFC.ico
| | +--- CommMFC.rc2
| +--- Resource.h
| +--- stdafx.cpp
| +--- stdafx.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. 設(shè)置CSerialPort頭文件
右鍵【CommMFC根命名空間】-【屬性】-【C/C++】-【常規(guī)】-【附加包含目錄】-添加CSerialPort的頭文件目錄
D:\CommMFC\CSerialPort\include
或
$(ProjectDir)\..\CSerialPort\include
3. 添加CSerialPort源文件
右鍵【CommMFC根命名空間】-【添加】-【新建篩選器(命名為CSerialPort)】
右鍵【CSerialPort篩選器】-【添加】-【現(xiàn)有項(xiàng)】-添加CSerialPort的src目錄的所需文件()
所需文件清單如下:
- SerialPort.cpp
- SerialPortBase.cpp
- SerialPortWinBase.cpp
- SerialPortInfo.cpp
- SerialPortInfoBase.cpp
- SerialPortInfoWinBase.cpp
注意:
需要將添加的cpp文件的預(yù)編譯頭設(shè)置為"不使用預(yù)編譯頭",如右鍵【serialport.cpp】-【屬性】-【C/C++】-【預(yù)編譯頭】-【預(yù)編譯頭: 不使用預(yù)編譯頭】
如不設(shè)置會(huì)報(bào)錯(cuò):
serialport.cpp: fatal error C1010: 在查找預(yù)編譯頭時(shí)遇到意外的文件結(jié)尾。是否忘記了向源中添加“#include "stdafx.h"?
SerialPortBase.cpp: fatal error C1010: 在查找預(yù)編譯頭時(shí)遇到意外的文件結(jié)尾。是否忘記了向源中添加“#include "stdafx.h"?
SerialPortWinBase.cpp: fatal error C1010: 在查找預(yù)編譯頭時(shí)遇到意外的文件結(jié)尾。是否忘記了向源中添加“#include "stdafx.h"?
SerialPortInfo.cpp: fatal error C1010: 在查找預(yù)編譯頭時(shí)遇到意外的文件結(jié)尾。是否忘記了向源中添加“#include "stdafx.h"?
SerialPortInfoBase.cpp: fatal error C1010: 在查找預(yù)編譯頭時(shí)遇到意外的文件結(jié)尾。是否忘記了向源中添加“#include "stdafx.h"?
SerialPortInfoWinBase.cpp: fatal error C1010: 在查找預(yù)編譯頭時(shí)遇到意外的文件結(jié)尾。是否忘記了向源中添加“#include "stdafx.h"?
4. 增加CSerialPort的必要依賴庫
windows下CSerialPort必須的依賴庫為setupapi.lib
右鍵【CommMFC根命名空間】-【屬性】-【鏈接器】-【輸入】-【附加依賴項(xiàng)】-添加setupapi.lib
5. 在MFC中添加CSerialPort代碼
5.1 增加CSerialPort的頭文件、繼承類、接收函數(shù)及CSerialPort實(shí)例對(duì)象
在CommMFCDlg.h
文件中
- 增加CSerialPort的頭文件
- CCommMFCDlg類繼承
CSerialPortListener
- 增加接收函數(shù)
onReadEvent(const char *portName, unsigned int readBufferLen)
- 增加CSerialPort的實(shí)例對(duì)象
代碼如下:
// CommMFCDlg.h : 頭文件
//#pragma once// add by itas109
#include "CSerialPort/SerialPort.h"
#include "CSerialPort/SerialPortInfo.h"
using namespace itas109;
// end by itas109// CCommMFCDlg 對(duì)話框
class CCommMFCDlg : public CDialog, public CSerialPortListener // add by itas109
{...// add by itas109
private:void onReadEvent(const char *portName, unsigned int readBufferLen);// end by itas109// add by itas109
private:CSerialPort m_serialPort;// end by itas109
};
注意:
如果CCommMFCDlg不繼承CSerialPortListener,調(diào)用connectReadEvent函數(shù)時(shí)會(huì)報(bào)錯(cuò)
CSerialPort::connectReadEvent: 不能將參數(shù) 1 從CCommMFCDlg *const 轉(zhuǎn)換為itas109::CSerialPortListener *
5.2 增加串口的相關(guān)實(shí)現(xiàn)代碼
在CommMFCDlg.cpp
文件增加
CCommMFCDlg::OnInitDialog()
中增加CSerialPort的測(cè)試代碼- 增加OnReceive函數(shù)的實(shí)現(xiàn)
// CommMFCDlg.cpp: 實(shí)現(xiàn)文件
...BOOL CCommMFCDlg::OnInitDialog()
{...// TODO: 在此添加額外的初始化代碼// add by itas109m_serialPort.connectReadEvent(this);m_serialPort.init("COM1");m_serialPort.open();if (m_serialPort.isOpen()){m_serialPort.writeData("itas109", 7);}else{MessageBox(_T("open failed"));}// end by itas109...
}// add by itas109
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));}}
}
// end by itas109
6. 結(jié)果
代碼中的COM2對(duì)應(yīng)的串口為RS232環(huán)回測(cè)試硬件,因此對(duì)應(yīng)的結(jié)果為程序啟動(dòng)后,初始化并打開串口COM1,發(fā)送數(shù)據(jù)itas09
,隨后彈框提示收到數(shù)據(jù)(如OnReceive - data: itas109, size: 7)
License
License under CC BY-NC-ND 4.0: 署名-非商業(yè)使用-禁止演繹
Reference:
- https://github.com/itas109/CSerialPort
- https://gitee.com/itas109/CSerialPort
- https://blog.csdn.net/itas109