串口通讯:
一、
1.在用ReadFile和WriteFile读写串口时,既可以同步执行,也可以重叠执行:
在同步执行时,函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞,从而导致效率下降。
在重叠执行时,即使操作还未完成,这两个函数也会立即返回,费时的I/O操作在后台进行。
2.ReadFile和WriteFile函数是同步还是异步由CreateFile函数决定:
如果在调用CreateFile创建句柄时<指定了FILE_FLAG_OVERLAPPED标志>,那么调用ReadFile和WriteFile对该句柄进行的操作就应该是重叠的;
如果未指定重叠标志,则读写操作应该是同步的。
ReadFile和WriteFile函数的同步或者异步应该和CreateFile函数相一致。
3.ReadFile函数只要在串口 <输入缓冲区> 中读入指定数量的字符,就算完成操作。
WriteFile函数不但要把指定数量的字符拷入到 <输出缓冲区>,而且要 <等> 这些字符从串行口 <送出去>后才算完成操作。
如果操作成功,这两个函数都返回TRUE。
需要注意的是,当ReadFile和WriteFile <返回FALSE时,不一定就是操作失败>,线程应该调用GetLastError函数分析返回的结果。
例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING:这说明重叠操作还未完成,正在后台运行。
3.重叠I/O非常灵活,它也可以实现阻塞(例如我们可以设置一定要读取到一个数据才能进行到下一步操作)。
有两种方法可以 <等待> 操作完成:
一种方法是用像WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的hEvent成员;
另一种方法是调用GetOverlappedResult函数等待
二、串口通讯大致步骤:
(一)、open()打开串口“读”
1、 打开串口函数(以异步(重叠)IO打开串口):m_hCommHandle标识通讯端口的句柄
m_hCommHandle = CreateFile(szComm, //COM口
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_FLAG_OVERLAPPED, //重叠方式
NULL);
2、获取串口当前配置函数
GetCommState(m_hCommHandle, &dcb);
dcb.BaudRate = dwBaudRate;//当前波特率
dcb.ByteSize = byByteSize;//数据位数
dcb.Parity = byParity;//奇偶校验
dcb.StopBits = byStopBits;//停止位
3、配置串口函数(设置COM口的设备控制块)
SetCommState(m_hCommHandle, &dcb))
4、将串口DTR线路升成高电位
EscapeCommFunction(m_hCommHandle, SETDTR);
要实现自己的流控制时。此时应用必须负责RTS和DTR信号线的状态改变。
5、设置串行口的输入和输出缓冲区的大小
SetupComm(m_hCommHandle, 4096, 4096))
6、在读写串口之前,要用PurgeComm()函数清空缓冲区,终止正在进行的读写操作
PurgeComm(m_hCommHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))//清空缓冲区
7、创建一个线程用于接收串口的数据
8、线程函数中“实时读串口”
8.1 设置要监控的事件
SetCommMask(m_hCommHandle, EV_RXCHAR | EV_ERR);
EV_RXCHAR:输入缓冲区中已收到数据
8.2 等待串口通信事件的发生;
WaitCommEvent(m_hCommHandle, &dwMask, &m_eventOverlapped))
GetOverlappedResult该函数返回重叠操作的结果:用来判断异步操作是否完成;
8.3 读串口 ReadFile()数据:
GetOverlappedResult该函数返回重叠操作的结果:用来判断异步操作是否完成;
8.4 接收完成后,进入RecvDataEvent响应函数(注册过SerialPort的类会实现RecvDataEvent函数)
(二)、Send()发送数据,写串口
9、写串口
9.1 立即终止异步发送+清空发送缓存区
PurgeComm(m_hCommHandle, PURGE_TXABORT | PURGE_TXCLEAR);
9.2 写串口
WriteFile(m_hCommHandle, vpData, dwDataLen, &dwWriteLen, &m_writeOverlapped)
GetOverlappedResult该函数返回重叠操作的结果:用来判断异步操作是否完成;
9.3 调用子类的回调函数SendDataEvent函数,实现发送
(三)、close()关闭串口
10. 关闭串口
WaitForSingleObject(m_hThread, INFINITE);//等线程结束后关闭
CloseHandle(m_hThread);//关闭线程句柄
EscapeCommFunction(m_hCommHandle, CLRDTR);//将DTR线路降成低电位
PurgeComm(m_hCommHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); //终止读写/清空缓冲区函数
CloseHandle(m_hCommHandle);//关闭串口
相关文章:
串口通讯:
一、 1.在用ReadFile和WriteFile读写串口时,既可以同步执行,也可以重叠执行: 在同步执行时,函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞,从而导致效率下降。 在重叠执行时,即使操作…...
批量重命名软件推荐 A Better Finder Rename 12最新 for mac
A Better Finder Rename的大量重命名选项被组织成15个直观的类别,涵盖了一个伟大的文件重命名器所期望的所有文本,字符,位置,转换和截断功能。 除此之外,A Better Finder Rename提供了更多高级功能,可以满…...
【2013年数据结构真题】
highlight: a11y-dark 41题 王道解析: 算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元素Num 。然后重新计数,确认Num是否是主元素。算法可分为以下两步: 选取候选的主元素:依次扫描所给数组中的每个…...
csrf学习笔记总结
跨站请求伪造csrf csrf概述 掌握CSRF 漏洞原理 掌握CSRF 漏洞场景 掌握CSRF 漏洞验证 csrf原理 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程…...
【kafka】windows安装启动
1.zookeeper的安装与启动 快速打开window powershell: windowx,选 2.kafka下载 —注意kafka和zookeeper需要版本匹配 安装路径 注意,kafka安装目录不能有空格。文件下载到: D:\Program_Files\kafka_2.12-3.6.0新建logs文件 修改c…...
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
大家如果对使用netty搞这些http请求什么的感兴趣的,可以参观我自己创建的这个项目。 nanshaws/nettyWeb: 复习一下netty,并打算做一个web项目出来 (github.com) Redis的基本命令包括: SET key value:设置指定key的值。 GET key…...
《白帽子讲web安全》笔记
第八章 文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力 文件上传后导致的常见安全问题一般有: ❍ 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本…...
unity UGUI无限循环滚动居中
最近在做一个ui循环滚动的功能,网上找了半天脚本感觉都和我实际需求不太符合,自己花费一些时间完成了这个功能记录一下。下面开始正题 ,我是采用unity自带组件Scroll View来完成,首先设置Scroll View如下图 面板层级结构如下 然…...
人工智能与新能源电动车的融合——技术创新引领未来交通革命
人工智能与新能源电动车的融合——技术创新引领未来交通革命 摘要:本文探讨了人工智能与新能源电动车领域的技术融合,分析了其在智能驾驶、电池技术、充电设施等方面的应用与创新。文章指出,这两大技术的结合将重塑交通产业,为我…...
交换机堆叠 配置(H3C)堆叠中一台故障如何替换
交换机堆叠 配置(H3C)堆叠中一台故障如何替换 堆叠用来干什么?配置两台成员设备的 IRF(堆叠)Switch01配置Switch02配置 如何替换堆叠中坏掉的一台交换机 堆叠用来干什么? 一台交换机网口有限,无…...
2024年软考有哪些考试科目?具体考什么内容?
软考分为三个考试层次,软考初级、中级和高级,每个层次的考试科目,其考试内容都是不一样的。报考时先选层次,再选科目。选好科目后,再看自己需要学习哪些内容。 一、软考初级科目 1.程序员: 考核内容&…...
2023.11.12 hive中分区表,分桶表与区别概念
1.分区表 分区表的本质就是在分目录 当Hive表对应的数据量大、文件多时,为了避免查询时全表扫描数据。比如把一整年的数据根据月份划分12个月(12个分区),后续就可以查询指定月份分区的数据,尽可能避免了全表扫描查询。…...
Pass-中间件管理
中间件管理是指对应用软件和操作系统之间的软件层进行管理和调度的过程,以优化应用性能和提高系统可靠性。 中间件管理是什么? 中间件管理是软件开发过程中不可或缺的一部分,它主要负责管理应用程序与操作系统之间的交互。中间件࿰…...
什么是GIL锁,有什么作用?python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型用多线程。
1 什么是gil锁,有什么作用? 2 python的垃圾回收机制是什么样的? 3 解释为什么计算密集型用多进程,io密集型用多线程。 1 什么是gil锁,有什么作用? 1 GIL:Global Interpreter Lock又称全局解释器…...
Postman如何发送Https请求
Postman如果想要发送Https请求,需要从设置中将SSL安全认证禁用...
Redis集群启动
配置项 # 允许Redis监听所有网络接口的IP地址,即0.0.0.0。这意味着Redis可以接受来自任何网络接口的连接。 bind 0.0.0.0 # 关闭保护模式。在保护模式下,Redis只接受来自本机的连接。关闭保护模式后,Redis可以接受来自任何网络接口的连接。 protected-mode no # 在后…...
使用proxy把后端返回的图片域名替换成目标域名
proxy 对象用于创建一个对象的代理,是在目标对象之前架设一个拦截,外界对该对象的访问,都必须先通过这个拦截。通过这种机制,就可以对外界的访问进行过滤和改写。 ES6 原生提供 Proxy 构造函数,用来生成 Proxy 实例。…...
css实现div倾斜效果
效果如下: <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head> <style> *{margin:0;padding: 0;} .box1{margin:30px 100px;width:100px;height:200px;background:blueviolet;} …...
算法学习打卡day45|动态规划:股票问题总结
Leetcode股票问题总结篇 动态规划的股票问题一共六道题,买卖股票最佳时机和买卖股票手续费都是一个类型的问题,维护好买入和卖出两个状态即可,方法一摸一样。而冷冻期也差不多就是状态多了点,买入、保持卖出、当日卖出、以及冷冻期…...
内网环境下让容器上网,并制作一个httpd容器
1.下载基础镜像 上一次,我们通过正向互联网代理在内网环境中,搭建了一个docker环境,具体环境如下: 1) 内网docker服务器:192.168.123.1,操作系统为:redhat 7.9 2) 代理服务器(可通外网)&#…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
