Windows 10 IoT ARM64平臺除了支持新的UWP框架,也兼容支持老框架MFC。使得用戶在Windows 10 IoT下可以對原MFC工程進行功能升級,不用在新框架下重寫整個工程。熟悉MFC開發的工程師也可以在Windows 10 IoT平臺下繼續使用MFC進行開發。
本文展示MFC串口程序開發,及需要注意的地方。
1. 打開visual studio 2022,點擊“創建新項目”。
2. 選擇篩選條件,語言C++,平臺選擇Windows,應用類型選擇桌面。
3. 選擇“MFC應用”,點擊下一步。
4. 應用程序類型選擇基于對話框,其它選項默認,創建好工程。
拖動工具欄中控件到設計窗口中,設置好控件屬性,綁定好控件變量名及消息響應函數。此處與傳統MFC程序開發一樣。
可以參考文章《UWP串口程序開發》,使用新Devices庫查詢串口,打開串口,讀寫串口。本文依舊采用傳統的接口Createfile,WriteFile,ReadFile操作串口。
3.1 查詢串口
已知串口名,可以直接通過CreateFile打開串口。或者通過API接口進行查詢。
#include <cfgmgr32.h> #include <propkey.h> #include <initguid.h> #include <devpkey.h> std::wstring devicePath; devicePath = GetFirstDevice(); Handle serialHandle= CreateFileW(devicePath.c_str(),GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL)); //Handle serialHandle= CreateFileW(L” \\\\?\\ACPI#NXP0113#2#{86e0d1e0-8089-11d0-9ce4-08003e301f73}\\SERCX”,GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL)); std::wstring GetFirstDevice () { ULONG length; CONFIGRET cr = CM_Get_Device_Interface_List_SizeW( &length, const_cast<GUID*>(&GUID_DEVINTERFACE_COMPORT), nullptr, // pDeviceID CM_GET_DEVICE_INTERFACE_LIST_PRESENT); if (cr != CR_SUCCESS) { throw wexception( L"Failed to get size of device interface list. (cr = 0x%x)", cr); } std::vector<WCHAR> buf(length); cr = CM_Get_Device_Interface_ListW( const_cast<GUID*>(&GUID_DEVINTERFACE_COMPORT), nullptr, // pDeviceID buf.data(), static_cast<ULONG>(buf.capacity()), CM_GET_DEVICE_INTERFACE_LIST_PRESENT); if (cr != CR_SUCCESS) { throw wexception( L"Failed to get device interface list. (cr = 0x%x)", cr); } return std::wstring(buf.data()); }
3.2 打開串口
與WINCE不同,Windows 10 IoT需要用FILE_FLAG_OVERLAPPED異步操作模式打開和讀寫串口,如果使用同步操作模式打開串口進行讀寫,讀寫效率會有影響。
HANDLE m_hComm = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
設置串口參數
GetCommState(m_hComm, &dcb); /* 讀取串口的DCB */ dcb.BaudRate = 115200; dcb.ByteSize = 8; dcb.Parity = 0; dcb.StopBits = 0; dcb.fBinary = TRUE; dcb.fRtsControl = RTS_CONTROL_DISABLE; SetCommState(m_hComm, &dcb); /* 設置串口的DCB */
3.3 讀串口
異步操作模式需要設置OVERLAPPED
#include <wrl.h> using namespace Microsoft::WRL::Wrappers; auto overlapped = OVERLAPPED(); overlapped.hEvent = overlappedEvent.Get(); DWORD bytesRead = 0; if (!ReadFile( pDlg->m_hComm, reinterpret_cast<BYTE*>(recvBuf), 1024, &bytesRead, &overlapped) && (GetLastError() != ERROR_IO_PENDING)) { DWORD error = GetLastError(); } if (!GetOverlappedResult( pDlg->m_hComm, &overlapped, &bytesRead, TRUE)) { DWORD error = GetLastError(); } if (bytesRead != 0) { OnCommRecv(pDlg, recvBuf, bytesRead); /* 接收成功調用回調函數 */ }
3.4 寫串口
用異步模式寫串口
auto overlapped = OVERLAPPED(); overlapped.hEvent = overlappedEvent.Get(); if (!WriteFile( m_hComm, psendbuf, len, &dwactlen, &overlapped) && (GetLastError() != ERROR_IO_PENDING)) { DWORD error = GetLastError(); } if (!GetOverlappedResult( m_hComm, &overlapped, &dwactlen, TRUE)) { DWORD error = GetLastError(); }
3.5 串口關閉
CloseHandle(m_hComm);
3.6 創建timer自動發送
添加對話框的timer消息響應函數OnTimer
1. 啟動timer
SetTimer(1, m_period, NULL);
2. 退出時關閉timer
KillTimer(1);
打開Win10 IoT板子上的調試助手。
選擇工程平臺為ARM64,編譯運行,示例如下。
需要程序源碼可以聯系英創工程師獲得。
成都英創信息技術有限公司 028-8618 0660