<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

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

    正在播放酒店精品少妇约| 最新国产精品自在线观看| 国产精品美女网站在线观看| 国产精品久久久久无码av| 亚洲精品午夜无码电影网| 国产精品αv在线观看| 亚洲国产精品yw在线观看| 91精品视频网站| 色婷婷精品免费视频| 无码国产精品一区二区免费式直播 | 国产精品成人一区二区三区| 久久国产精品99久久小说| 国产精品自拍亚洲| 国产高清国产精品国产专区| 国产亚洲精品自在久久| 国产亚洲精品美女久久久久| 99久久久国产精品免费无卡顿| 亚洲精品无码永久在线观看你懂的 | 四虎永久在线精品视频免费观看| 免费精品国产自产拍在| 久久久精品人妻一区亚美研究所| 久久国产精品一区| 人妻少妇精品系列| 在线观看亚洲精品专区| 国产69精品久久久久观看软件| 精品无码三级在线观看视频 | 久久久久久国产精品无码超碰| 精品无人区无码乱码大片国产| 国内成人精品亚洲日本语音| 真实国产精品vr专区| 91天堂素人精品系列网站| 久久免费精品一区二区| 中文精品北条麻妃中文| 天天爽夜夜爽8888视频精品| 青青青亚洲精品国产| 国产精品久久无码一区二区三区网| 久99久热只有精品国产女同| 久久这里只有精品18| 久久精品中文字幕无码| 久久精品国产久精国产| 久久精品国产精品国产精品污|