当前位置: 首页 > news >正文

Windows 10 ARM64平台MFC串口程序开发

        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应用”,点击下一步。

        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板子上的调试助手。

        选择工程平台为ARM64,编译运行,示例如下。

需要程序源码可以联系英创工程师获得。

相关文章:

  • 前端知识点---事件委托和机制-阻止冒泡机制-阻止默认行为机制(javascript)
  • JavaScript描述Object.create()方法的原理及作用,如何利用它创建一个具有指定原型的对象?
  • java: 无法访问org.springframework.web.bind.annotation.GetMapping
  • 正则表达式-笔记
  • Transformer的理解
  • 7.2 分治-快排:LeetCode 912. 排序数组
  • Debezium日常分享系列之:Debezium 3.1.0.CR1发布
  • 01STM32时钟树
  • 【redis】哨兵节点作用演示和重选主节点详细流程
  • Vue $bus被多次触发
  • Android 删除aar中的一个类 aar包冲突 aar类冲突 删除aar中的一个包
  • 【JavaScript】筑基期功法
  • Spring Boot 自定义 Starter 组件的技术指南
  • Vue简单的store模式
  • 【解决方法】VMware安装Ubuntu时安装窗口过小看不到继续按钮 | Ubuntu安装窗口过小看不到按钮
  • kotlin多平台(KMP)开发桌面运行及打包
  • UDP数据报套接字编程
  • 三维动态规划-LeetCode3418. 机器人可以获得的最大金币数
  • 3.26学习总结 做题
  • WPS JS宏编程教程(从基础到进阶)--第二部分:WPS对象模型与核心操作
  • 怎么给网站做https/湖南seo网站策划
  • 三国群英传私服网站怎么做/站长之家怎么找网址
  • 党支部建设网站/产品推广文案怎么写
  • 简述网站设计流程/武汉seo首页优化技巧
  • 厦门市网站建设app开发/百度网站联系方式
  • 手机网站模板单页/2023百度秒收录技术