关于异步读写串口的注意事项

用API实现串口异步读写 阅读详情

同步读写串口很简单,异步读写串口有几个地方需要注意,以例子说明:

1. 打开串口

HANDLE m_hCom;

m_hCom = CreateFile(_T("COM1"),

       GENERIC_READ|GENERIC_WRITE, //允许读和写

       0, //独占方式

       NULL,

       OPEN_EXISTING, //打开而不是创建

      FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //同步方式填0 ,此处需要注意

      NULL);

 

    if( m_hCom==INVALID_HANDLE_VALUE)//(HANDLE)-1

    {

       AfxMessageBox(_T("打开COM失败!"));    

    }

 

    //设置输入输出缓冲区大小

    SetupComm(m_hCom,1024,512);

 

    COMMTIMEOUTS TimeOuts;

    //设定读超时

    TimeOuts.ReadIntervalTimeout = MAXDWORD;

    //注意设小后读不到数据

    TimeOuts.ReadTotalTimeoutMultiplier = 50;

    TimeOuts.ReadTotalTimeoutConstant = INFINITE;

    //在读一次输入缓冲区的内容后读操作就立即返回,

    //而不管是否读入了要求的字符。

 

    //设定写超时

    TimeOuts.WriteTotalTimeoutMultiplier = 50;

    TimeOuts.WriteTotalTimeoutConstant = INFINITE;

    SetCommTimeouts(m_hCom,&TimeOuts); //设置超时

 

    DCB dcb;

    GetCommState(m_hCom,&dcb);

    dcb.BaudRate = 2400;  //波特率为

    dcb.ByteSize = 8; //每个字节有位

    dcb.Parity = NOPARITY; //无奇偶校验位

    dcb.StopBits = TWOSTOPBITS; //2个停止位TWOSTOPBITS

    dcb.fBinary = TRUE;

    SetCommState(m_hCom,&dcb);

 

    PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

2. 读取串口(写串口类似)

    //接收缓冲区

    unsigned char buff[32];

    memset(buff,0,32);

     //读取的字节数

    DWORD dwReadBytes = 32;

     //读取字节数

    DWORD dwWriteBytes = 32;

      //异步读写串口

    OVERLAPPED m_overlp;

     //创建通知事件

     m_overlp.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

     //异步读写串口数据,

    unsigned long dataLength = 0;

    bool  bReadState   =   ReadFile(m_hCom,buff,dwReadBytes,&dwReadBytes,&pThis->m_overlp);

   //等待读取完成,超时为2秒,INFINITE为永不超时

    WaitForSingleObject(m_hCom,,2000);

 

    //取出数据长度

    //取得串口数据的长度,异步方式这样获取数据的长度,而不是使用dwReadBytes返回的值,

    //异步操作时dwReadBytes返回的值为0,同步操作时才可这样取得数据长度,需要特别注意!!!

   dataLength = m_overlp.InternalHigh;

 

 

Qt6基础教程:串口通信与Qt Serial Port模块详解 本文详细介绍了Qt6 Serial Port模块的使用,包括QSerialPortInfo枚举串口及跨平台注意事项,QSerialPort的参数配置(波特率、数据位、停止位、校验位)的setter/getter函数与两种赋值方式,串口的打开/关闭,以及异步与同步两种数据读写方式,为串口通信编程提供了完整的基础教程。 阅读详情

相关推荐

Matlab使用串口进行数据通信

Matlab进行串口通信 文章目录Matlab进行串口通信前言问题解决方案方法一:Instrument Control Toolbox方法二.编写通信脚本 前言 在电机运行过程中,需要将电机的姿态等参数通过串口传输至PC端,然后在Matlab进行姿态解算,这样便可以快速直观的获取仪器的井斜角度、方位角、工具面角等参数信息。 问题 如何使用Matlab进行串口通信? Matlab串口通信时的注意事项。 解决方案 Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrum

weixin_46943050的博客 2万+

串口异步读写

串口异步读写 最近尝试写了一个串口读写的程序,学习并复习了一些知识点。本文首先讲异步读写注意点,然后讲串口的注意点。因为有些问题没有深入研究下去,所以本文也仅仅当做一个笔记。   1.      文件指针 我们使用ReadFile和WriteFile来进行读写,这两个API是用来读写文件的,在同步读写中,有一个文件指针的概念,但是在异步读写中,系统会忽略文件指针。 OVERLAP

misterliwei的专栏 6026

Boost串口通信实战:从基础配置到异步读写

本文详细介绍了使用Boost.Asio库进行串口通信的实战指南,从基础配置到异步读写操作。通过跨平台的serial_port组件,开发者可以高效实现嵌入式系统和工业控制应用中的串口通信,涵盖同步/异步模式、多端口管理和性能优化等关键技巧。

weixin_29179311的博客 398

异步读写的简单串口类

 // Serial.h#ifndef __SERIAL_H__ #define __SERIAL_H__#define FC_DTRDSR       0x01 #define FC_RTSCTS       0x02 #define FC_XONXOFF      0x04 #define ASCII_BEL       0x07 #define ASCII_B

Chendy的专栏 1418

C# 实现串口通讯实现方式以及用途(二)

本文介绍了C#实现串口通信的基本步骤,包括串口参数配置(波特率、数据位等)、数据收发方法以及异常处理。关键点包括:通过System.IO.Ports命名空间操作串口,使用DataReceived事件实现异步接收,以及注意线程安全和参数一致性。文章还提供了异步优化方案和完整代码示例,适用于控制台或UI应用程序开发,并强调资源释放和跨平台兼容性等注意事项。150字

仰望星空的人 1393

深入Windows RS232串口编程:从API原理到异步I/O实战

串口通信作为嵌入式、工控和仪器仪表领域的基础通讯方式,其核心在于实现设备间的可靠数据交换。其工作原理基于异步串行传输协议,通过配置波特率、数据位和校验位等参数确保数据准确收发。掌握底层串口编程技术,对于开发高可靠性的数据采集、设备控制和工业自动化系统具有重要价值。在实际应用中,开发者常需处理二进制数据帧、超时机制和复杂的硬件握手信号。本文聚焦于Windows平台,通过解析CreateFile、ReadFile、WriteFile等核心API,并深入探讨异步重叠I/O(Overlapped I/O)模式,指导

weixin_30764771的博客 508

C#串口通信入门:同步与异步收发详解

本文介绍了C#中串口通信的实现方法,主要包含同步和异步两种收发方式。首先说明了SerialPort类的基本配置参数和使用前提,包括.NET Framework和.NET Core的不同依赖要求。同步方式适合控制台程序,通过示例展示了打开串口、发送接收数据的基本流程和注意事项。异步方式则更适合UI程序,详细介绍了事件驱动(DataReceived)和异步方法(ReadAsync/WriteAsync)两种实现方案,重点讲解了跨线程UI更新的处理方法。文章还总结了常见问题解决方案,对比了同步和异步的适用场景,并

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1789

【Qt项目实战】 : 实现串口的同步和异步读写消息

Qt下同步和异步读写串口消息

Mr.Sugarcane 1078

串口通讯的原理和基础知识

是指数据的各个位用多条数据线同时进行传输优点:传输速度快缺点:占用引脚资源多。

m0_46511996的博客 2825

【QT开发教程】QIODevice类详解及实战应用:Qt中的输入输出设备接口

在软件开发中,处理输入输出(I/O)是一个基础且重要的任务。Qt框架提供了QIODevice类,作为所有输入输出设备的抽象基类,帮助开发者处理文件、网络、串口等多种I/O操作。本文将深入探讨QIODevice的功能及其在Qt应用中的实际应用。

科技改变人类,技术成就未来 429

别再手动调时间了!用Windows自带的tzutil命令,1分钟搞定时区错误

本文介绍了如何使用Windows自带的tzutil命令快速解决时区错误问题。通过简单的命令行操作,用户可以一键切换时区、查看全球时区代码库,并实现自动化时区同步。相比传统GUI设置,tzutil更可靠且高效,特别适合企业环境批量部署。

weixin_42531494的博客 314

WINDOWS平台下使用ACE框架的异步串口操作

利用ACE当中的包装类进行串口操作在ACE目录下的examples/IPC_SAP/DEV_SAP有例子做详细介绍。但是这里的例子是阻塞模式的。于是我试图使用ACE当中的一些框架来做一个异步的串口操作。       ACE当中可以使用的异步操作框架有Reactor和Proactor等。Reactor采用Bridge模式有多个实现,在Windows下面默认的实现是ACE_WFMO_Reacto

胜利者的经验并不复杂,那就是寻找人生的关键点,并在关键时刻竭尽全力 1518

基于LangGraph的智能报告生成平台项目分析

不知道你是否知道或者了解OpenAI and Gemini Deep Research。他们是一种能够根据输入问题进行规划、结合网络搜索获取信息并最终呈现结果的研究工具或技术。那这样research是如何实现的呢?最近刚好看到一个实现类似功能的开源项目: open_deep_search。本文将基于该项目进行代码层面剖析。

u011160113的博客 923

串口通信中使用共享指针

可以有效管理资源生命周期,避免内存泄漏和悬挂指针问题。,可以简化串口通信中的资源管理,提升代码健壮性。初始化串口对象,确保资源自动管理。,确保回调执行期间对象存活。在串口通信中使用共享指针(

Taylor_0522的博客 927

AFC自动售检票系统与人工智能AI结合的关键应用方案

针对售检票、大客流管理、设备运维及服务优化提供了可落地的技术支持和实现细节,可作为地铁智慧交通项目的实践参考

leijinquan01的博客 1513

嵌入式面试题精选100道及参考答案(4万字长文)

指针是C语言中一种特殊的变量,它存储的是另一个变量的内存地址。指针的使用提供了一种间接访问和操作内存的方法。地址操作:通过使用运算符,可以获取变量的地址,并将这个地址赋值给指针变量。间接引用:使用运算符可以访问指针指向的变量的值。动态内存分配:指针用于动态地分配和释放内存。数组操作:指针可以用于遍历和操作数组。函数参数:指针作为函数参数可以改变原始数据。字符串操作:在C语言中,字符串通常以字符数组的形式存在,并通过字符指针进行操作。// 指向数组的第一个元素i < 5;++i) {在这个例子中,

大模型大数据攻城狮的专栏 1971

C SerialPort IO操作 - 大数据收发支持

C# SerialPort IO操作 - 大数据收发支持 去发现同类优质开源项目:https://gitcode.com/ 概述 本仓库提供了一套高效、稳定的C#类库,专为处理串口通信中的大量数据读写需求而设计。在日常的工业控制、设备通讯等场景中,经常需要进行高速、大容量的数据交换。此资源完美解决了标准SerialPort类在处理大数据流时可能遇到的限制和效率问题。通过优化读写逻辑,实现了能够一次...

gitblog_09711的博客 552

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

weixin_42412049的博客 1513

C#使用EasyModbus进行通讯

EasyModbus是一个流行的.NET库,用于实现Modbus TCP、RTU和UDP协议通信。

Major_S的博客 1033

STM32G0/G4电机控制中三角函数与浮点运算优化实战

三角函数(sin/cos)和浮点运算是电机矢量控制(FOC)的核心基础,直接影响Clark/Park变换、SVPWM及观测器的实时性与精度。在资源受限的MCU上,标准math.h库因无硬件FPU支持而引发严重时序抖动,导致电流环延迟、转矩脉动增大甚至系统复位。通过硬件加速(如STM32G4的CORDIC协处理器)或定制化定点算法(如STM32G0的查表+线性插值),可将sin/cos计算从数十微秒压缩至1–3 μs量级,提升30倍以上效率。该方案广泛适用于BLDC/PMSM驱动、伺服控制及高动态响应嵌入式运

weixin_35751412的博客 109

贝叶斯地理统计模型R-INLA-1

贝叶斯地理统计模型R-INLA-1

学习中 2426

C# 工业通信协议详解

【代码】C# 工业通信协议详解。

qq_37372022的博客 478

STM32G474开发板初步入门与编程实战

STM32G474开发板提供了一种快速评估、原型设计和开发STM32G474应用的方式。它搭载了STM32G474RET6微控制器,配备512KB闪存、128KB RAM,支持各种常见的接口和连接,如USB、I2C、SPI、UART等。板载ST-Link/V2-1调试器/编程器,简化了开发过程。

qq_38334677的博客 4954

linux下串口的开发之非阻塞异步读

linux下串口的开发 读取串口数据使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。 char  buff[1024]; int    Len; int  readByte = read(fd,buff,Len); 可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作

huyuan7494的博客 3586

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

磁盘文件的正常读写与异步读写

磁盘文件的正常读写与异步读写 分类: c/c++2011-04-11 19:26 107人阅读 评论(0) 收藏 举报 在Win32系统中支持64位长度的文件,所以在很多文件操作函数中需要两个DWORD参数来表示文件长度,一个DWORD用来表示低32位,另一个用来表示高32位。 文件的读写进行在文件被正确打开后,但请确认在打开文件时设置了正确的读写标记。在Win32的文件

ccrrt的专栏 2048

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 简单内存泄漏检测方法 解决 Detected memory leaks! 问题(转)
下一篇: WinCE识别触摸笔的右键点击
ComputerInBook
博客等级 码龄19年 1168粉丝 464原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值