C++_串口编程_官方示例:监视通信事件

news2024/11/29 12:55:40

这是微软官方的一个例子,这个例子中,如果不做修改,那么他是可以异步运行的,会出现一个错误:官方也说了一下,但是不太好懂,我拷贝过来放在这里,作为参考。

如果无法立即完成重叠的操作,则函数返回 FALSE , GetLastError 函数返回 ERROR_IO_PENDING,指示操作正在后台执行。 发生这种情况时,系统会在 WaitCommEvent 返回之前将 OVERLAPPED 结构的 hEvent 成员设置为非信号状态,然后在发生指定事件或错误之一时将其设置为信号状态。 调用过程可以使用其中一个 等待函数 来确定事件对象的状态,然后使用 GetOverlappedResult 函数来确定 WaitCommEvent 操作的结果。 GetOverlappedResult 报告操作的成功或失败,并将 lpEvtMask 参数指向的变量设置为指示发生的事件。

总之异步在后台运行的那种,目前是出错,我把它修改为不是异步的方式,修改一下CreateFile()函数就可以了。修改后,这个程序就是同步的模式了,就是会一直处于等待状态,虽然不实用,但是好歹是能用了。下面说说是怎么修改的,具体的一看源代码就懂了。

首先,需要修改一下事件的类型:

//  fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR); //MS  code 
        fSuccess = SetCommMask(hCom, EV_RXCHAR);//改为 EV_RXCHAR事件

改为比较好懂的:EV_RXCHAR,表示接收到了一个字符并将其放入了输入缓冲区。

其次,就是修改了CreatFile()函数:

 hCom = CreateFile(TEXT("\\\\.\\COM1"),
        GENERIC_READ | GENERIC_WRITE,
        0,    // exclusive access 
        NULL, // default security attributes 
        OPEN_EXISTING,
        0,//FILE_FLAG_OVERLAPPED,此处修改过,改为了0,具体看文档吧,这个太多内容了。0就是同步的方式了。
        NULL
    );

再次,添加了一些cout 输出字符串的语句。

事件代码的具体含义如下:

含义
EV_BREAK在输入上检测到一个中断。
EV_CTSCTS (明送) 信号更改状态。
EV_DSRDSR (数据集就绪) 信号更改状态。
EV_ERR发生行状态错误。 行状态错误 CE_FRAME、 CE_OVERRUN和 CE_RXPARITY
EV_RING检测到振铃指示。
EV_RLSDRLSD (接收线信号检测) 信号更改状态。
EV_RXCHAR接收到了一个字符并将其放入了输入缓冲区。
EV_RXFLAG已接收事件字符并将其放置在输入缓冲区中。 事件字符在设备的 DCB 结构中指定,该结构使用 SetCommState 函数应用于串行端口。
EV_TXEMPTY输出缓冲区中的最后一个字符已发送。

完整的源代码如下:

 

// WatchCommunicationEventTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <assert.h>
#include <stdio.h>

int main()
{
   // std::cout << "Hello World!\n";
    HANDLE hCom;
    OVERLAPPED o;
    BOOL fSuccess;
    DWORD dwEvtMask;

    hCom = CreateFile(TEXT("\\\\.\\COM1"),
        GENERIC_READ | GENERIC_WRITE,
        0,    // exclusive access 
        NULL, // default security attributes 
        OPEN_EXISTING,
        0,//FILE_FLAG_OVERLAPPED,此处修改过,改为了0,具体看文档吧,这个太多内容了。0就是同步的方式了。
        NULL
    );

    if (hCom == INVALID_HANDLE_VALUE)
    {
        // Handle the error. 
        printf("CreateFile failed with error %d.\n", GetLastError());
        return 2;
    }

    // Set the event mask. 
    //此处修改过
    //  fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR); //MS  code 
        fSuccess = SetCommMask(hCom, EV_RXCHAR);//改为 EV_RXCHAR事件

    if (!fSuccess)
    {
        // Handle the error. 
        printf("SetCommMask failed with error %d.\n", GetLastError());
        return 1;
    }

    // Create an event object for use by WaitCommEvent. 

    o.hEvent = CreateEvent(
        NULL,   // default security attributes 
        TRUE,   // manual-reset event 
        FALSE,  // not signaled 
        NULL    // no name
    );


    // Initialize the rest of the OVERLAPPED structure to zero.
    o.Internal = 0;
    o.InternalHigh = 0;
    o.Offset = 0;
    o.OffsetHigh = 0;

    assert(o.hEvent);
    //下面的cout 也是博主自己加的,看到输出字符就是成功了
    if (WaitCommEvent(hCom, &dwEvtMask, &o))
    {
        if (dwEvtMask & EV_DSR)
        {
            std::cout << "EV_DSR event is happening";
        }

        if (dwEvtMask & EV_CTS)
        {
           std::cout << "EV_CTS event is happening";
        }
        if(dwEvtMask & EV_RXCHAR)
        {
            std::cout << "EV_RXCHAR event is happening";
        }
    }
    else
    {
        DWORD dwRet = GetLastError();
        if (ERROR_IO_PENDING == dwRet)
        {
            printf("I/O is pending...\n");

            // To do.
        }
        else
            printf("Wait failed with error %d.\n", GetLastError());
    }
    return 0;
}


 运行程序:首先是出现一个命令行窗口,啥也没有

 用VSPD 和 XCOM V2.6 创建虚拟的COM串口后,可以用XCOM 创建一个 从COM2 发送文本到COM1的操作,之后就有输出了,这个EV_RXCHAR事件发生了。

 

后续还可以多研究研究,作为一个最权威,最基本的例子,这个作为入门我觉得很不错,推荐给大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1_MyBatis入门

原生JDBC实现CURD的问题 1 编码繁琐 2 需要我们自己将结果集映射成对象 3 性能不太好 连接池 缓存 4 SQL语句和java代码的耦合度特别高 5 … … MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code&#xff0c;且改名为…

python学习笔记(10)

目录 第八章 函数 1.模块化程序设计&#xff08;模块化---封装、复用、可替代&#xff09; 2.定义函数 3.函数调用 4.return语句 5.函数参数 6.变量作用域 7.函数的递归调用 8.匿名函数 9.迭代器 10.生成器 11.装饰器 第八章 函数 1.模块化程序设计&#xff08;…

【线性表】—不带头单向非循环链表的增删查改

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…

dns网络服务器未响应是什么原因(如果各自方法都尝试后无法使用,请尝试重启猫)

事件起因&#xff1a;周六晚上&#xff0c;看法国对丹麦世界杯&#xff0c;突然网页浏览器无法工作。 1.然后尝试修改dns路由修改为114.114.114.114&#xff0c;又还原system32/driver/hosts仍然无法使用 2.查看是否有浏览器代理&#xff0c;查询无 3.查看是否有可疑进程&…

游戏开发24课 cocoscreator scrollview优化

分享一个 ScrollView 优化组件 增加一个 在线演示地址 显得高大上一点 image.png32762116 263 KB 目前支持的功能 水平/垂直滑动 可变尺寸动态更新 平滑滚动到底部 Grid 正序排列、倒序排列 无限循环滚动 单向、双向 下拉刷新 &#xff08;只是这么叫 实际上就是两种类型…

深度学习第四课——卷积神经网络(week 2)

目录 二、深度卷积网路 2.1 经典网络结构 2.1.1 LeNet - 5 2.1.2 AlexNet 2.1.3 VGG - 16 2.2 残差网络&#xff08;ResNets - Residual Networks&#xff09; 2.3 残差网络为什么有用 2.4 网络中的网络及11卷积 2.5 Inception网络 2.5.1 介绍 2.5.2 应用 2.6 使用…

24. [Python GUI] PyQt5中的模型与视图框架-表格部件QTableWidget

PyQt5的表格部件QTableWidget QTableWidget 类继承自 QTableView&#xff0c;该类是一个由 Qt 实现的标准的表格部件&#xff0c;该类的数据项由 QTableWidgetItem 类管理。 当前单元格(或当前项目)与当前索引或当前选择是相同的&#xff0c;即可以同时选择多个单元格&#x…

Spark 3.0 - 7.LR 多分类实现影评预测电影评分与指标评测

目录 一.引言 二.LR 多分类分析 三.LR 多分类实战 1.数据准备 Comment -> RDD -> DF 2.数据处理 JieBaTokenizer -> HashingVector 3.模型训练 LR 4.模型评估 Metrics 5.人工校验 DIY 四.总结 一.引言 Spark 3.0 - 5.ML Pipeline 实战之电影影评情感分析 通…

浅析数据采集工具Flume

title: Flume系列 第一章 Flume基础理论 1.1 数据收集工具产生背景 Hadoop 业务的一般整体开发流程&#xff1a; 任何完整的大数据平台&#xff0c;一般都会包括以下的基本处理过程&#xff1a; 数据采集 数据 ETL 数据存储 数据计算/分析 数据展现 其中&#xff0c;数据…

Nacos注册中心和服务方式

目录 一、服务治理介绍 常见的注册中心 二、Nacos注册中心介绍 三、运用Nacos搭建环境 四、DiscoveryClient实现负载均衡 五、Ribbon实现负载均衡 六、基于Feign实现服务调用 七、Feign传参 一、服务治理介绍 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调…

【Android +Tensroflow Lite】实现从基于机器学习语音中识别指令讲解及实战(超详细 附源码)

需要源码和配置文件请点赞关注收藏后评论区留言~~~ 一、基于机器学习的语音推断 Tensorflow基于分层和模块化的设计思想&#xff0c;整个框架以C语言的编程接口为界&#xff0c;分为前端和后端两大部分 Tensorflow框架结构如下图 二、Tensorflow Lite简介 虽然Tensorflow是一…

WMS类图结构分析-android12

为什么要分析类图&#xff1f; WMS是一个复杂的模块&#xff0c;就像一个很大的家族&#xff0c;里面有各种角色&#xff0c;认识类图就像是认识WMS模块中的各个角色&#xff0c;不先把人认清楚了&#xff0c;怎么更好的理解他们之间的交互&#xff1f; 我觉得&#xff0c;这…

【MATLAB教程案例47】基于双目相机拍摄图像的三维重建matlab仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 本课程学习成果预览: 目录 1.软件版本 2.基于双目相机拍摄图像的三维重建原理概述

GII全球创新指数2013-2020

1、数据来源&#xff1a;世界知识产权组织发布的《2021年全球创新指数报告》 2、时间跨度&#xff1a;2013-2020 3、区域范围&#xff1a;全球 4、指标说明&#xff1a; 全球创新指数&#xff08;Global Innovation Index&#xff0c;GII&#xff09;是世界知识产权组织、康…

20221127-1Spring_day01(资料来自黑马程序)

Spring_day01 今日目标 掌握Spring相关概念完成IOC/DI的入门案例编写掌握IOC的相关配置与使用掌握DI的相关配置与使用 1&#xff0c;课程介绍 对于一门新技术&#xff0c;我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring来说: 1.1 为什么要学? …

Reactive UI -- 反应式编程UI框架入门学习(一)

反应式编程 反应式编程是一种相对于命令式的编程范式&#xff0c;由函数式的组合声明来构建异步数据流。要理解这个概念&#xff0c;可以简单的借助Excel中的单元格函数。 上图中&#xff0c;A1B1C1&#xff0c;无论B1和C1中的数据怎么变化&#xff0c;A1中的值都会自动变化&a…

Kafka - 08 Kafka Broker工作流程 | 节点服役 | 节点退役

文章目录1. Kafka Broker 工作流程2. Kafka 节点服役1. 增加一个Kafka节点2. 执行负载均衡操作3. Kafka 节点退役1. Kafka Broker 工作流程 Kafka上下线时Zookeeper中的数据变化&#xff1a; [zk: localhost:2181(CONNECTED) 9] ls / [zookeeper, kafka_cluster][zk: localhost…

使用nw.js快速开发一个基于浏览器的小型桌面端(适用于高校学生实验作业)

首先讲下退坑事项&#xff0c;节约读者时间 生成的exe会依赖SDK文件夹下的一些dll&#xff0c;所以不能简单的交付这个exe&#xff0c;需要使用额外的软件进行打包&#xff0c;如Enigma Virtual Box、inno setup自定义可执行文件的icon也要额外软件&#xff0c;如Resource Hac…

SCDM 实例教程:基本几何建模

作者 | 张杨 ANSYS SpaceClaim Direct Modeler&#xff08;简称 SCDM&#xff09;是基于直接建模思想的新一代3D建模和几何处理软件。SCDM可以显著地缩短产品设计周期&#xff0c;大幅提升CAE分析的模型处理质量和效率&#xff0c;为用户带来全新的产品设计体验。 本文将主要…

常用 CMD 命令

前言 作为一个程序员&#xff0c;可能更多的是在 Linux 中使用命令来操作。但在日常使用 Windows 的过程中&#xff0c;或多或少会使用到命令提示符窗口&#xff0c;也就是 Windows 中的 CMD。这个时候&#xff0c;掌握一些常用的命令就尤为重要了&#xff0c;一方面方便自己使…