<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • Windows 10 ARM64平臺MFC串口程序

     2025-3-26 17:06:13     作者:楊陽     聯系作者    

    Windows 10 IoT ARM64平臺除了支持新的UWP框架,也兼容支持老框架MFC。使得用戶在Windows 10 IoT下可以對原MFC工程進行功能升級,不用在新框架下重寫整個工程。熟悉MFC開發的工程師也可以在Windows 10 IoT平臺下繼續使用MFC進行開發。

    本文展示MFC串口程序開發,及需要注意的地方。

     1、創建MFC工程 

    1.      打開visual studio 2022,點擊“創建新項目”。

    2.      選擇篩選條件,語言C++,平臺選擇Windows,應用類型選擇桌面。

    3.      選擇“MFC應用”,點擊下一步。

    6.png

    4.  應用程序類型選擇基于對話框,其它選項默認,創建好工程。

     2、界面設計 

    拖動工具欄中控件到設計窗口中,設置好控件屬性,綁定好控件變量名及消息響應函數。此處與傳統MFC程序開發一樣。

     3、串口代碼 

    可以參考文章《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);

     4、調試 

    打開Win10 IoT板子上的調試助手。

    3.png

    選擇工程平臺為ARM64,編譯運行,示例如下。

    7.png

    需要程序源碼可以聯系英創工程師獲得。

    9999国产精品欧美久久久久久| 最新日韩精品中文字幕| 久久久精品人妻一区二区三区四| 国内精品一区二区三区最新| 91久久精品国产91性色也| 亚洲精品国产日韩无码AV永久免费网 | 99re在线视频精品| 久久精品视频免费播放| 国产天堂亚洲精品| 苍井空亚洲精品AA片在线播放 | 久久99精品久久久久久齐齐| 2021国产精品久久精品| 精品无码久久久久国产动漫3d| 久久久久久国产精品免费无码 | 91精品国产自产在线观看| 久久亚洲精品人成综合网| 久久99精品久久久久久综合| 无码精品人妻一区二区三区人妻斩| 国产成人精品日本亚洲| 久久这里只精品99re免费| 久久久久久影院久久久久免费精品国产小说| 久热这里只精品99re8久| 久久99精品一久久久久久| 无码国产精品一区二区免费vr | 九九热这里都是精品| 国产精品爱搞视频网站| 香蕉久久综合精品首页| 日本精品一区二区在线播放| 91精品成人免费国产片| 亚洲精品免费在线| 97视频热人人精品免费| 日韩精品一区二区三区中文版 | 538精品视频在线观看| 国产剧情国产精品一区| 久久精品免费观看| 亚洲综合一区二区国产精品 | 日韩精品福利片午夜免费观着| 国产精品无码一区二区三区毛片| 国产精品视频无圣光一区| 亚洲国产精品毛片av不卡在线| 热久久这里是精品6免费观看|