串口之OVERLAPPED结构体详解

OVERLAPPED结构体是Windows API中用于实现串口和其他设备的异步I/O操作的关键元素。它包含Internal、InternalHigh、Offset、OffsetHigh和hEvent等成员,用于记录操作状态和位置信息。异步I/O允许程序在后台执行读写操作,同时进行其他任务,提高效率和灵活性。OVERLAPPED I/O使得多个线程能同时进行I/O操作,避免阻塞。
部署运行你感兴趣的模型镜像
typedef struct _OVERLAPPED { 
  DWORD Internal; 
  DWORD InternalHigh; 
  DWORD Offset; 
  DWORD OffsetHigh; 
 HANDLE hEvent; } OVERLAPPED
Internal: 预留给操作系统使用。它指定一个独立于系统的状态,当GetOverlappedResult函数返回时没有设置扩展错误信息ERROR_IO_PENDING时有效。
InternalHigh: 预留给操作系统使用。它指定长度的数据转移,当GetOverlappedResult函数返回TRUE时有效。
Offset: 该文件的位置是从文件起始处的字节偏移量。调用进程设置这个成员之前调用ReadFile或WriteFile函数。当读取或写入命名管道和通信设备时这个成员被忽略设为零。
OffsetHigh: 指定文件传送的 字节 偏移量的高位字。当读取或写入命名管道和通信设备时这个成员被忽略设为零。
hEvent: 在转移完成时处理一个事件设置为有信号状态。调用进程集这个成员在调用ReadFile、 WriteFile、TransactNamedPipe、 ConnectNamedPipe函数之前。
作用:
O设备处理必然让主程序停下来干等I/O的完成,解决这个问题,可以使用OVERLAPPED。
OVERLAPPED I/O是WIN32的一项技术, 你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O进行过程中仍然能够继续处理 事务。事实上,操作系统内部正是以 线程来I/O完成OVERLAPPED I/O。你可以获得线程的所有利益,而不需付出什么痛苦的代价。也就是说,OVERLAPPED主要是设置异步I/O操作,异步I/O操作是指应用程序可以在后台读或者写数据,而在前台做其他事情。
Allen denver在他的《Serial Communication in Win32》中是这样解释OVERLAPPED I/O的:我个人认为还是比较准确的
Overlapped I/O is not as straightforward as nonoverlapped I/O, but allows more flexibility and efficiency. A port open for overlapped operations allows multiple threads to do I/O operations at the same time and perform other work while the operations are pending. Furthermore, the behavior of overlapped operations allows a single thread to issue many different requests and do work in the background while the operations are pending.

您可能感兴趣的与本文相关的镜像

LobeChat

LobeChat

AI应用

LobeChat 是一个开源、高性能的聊天机器人框架。支持语音合成、多模态和可扩展插件系统。支持一键式免费部署私人ChatGPT/LLM 网络应用程序。

更新了下。。。 ************************************************************************ 函数名称:SP_InitComm 函数功能:初始化异步窗口操作模块 参数.一:lpComName In/Out:In 可空:N 意思:速率 返回值类型:要读取的串口号码 意思:是否初始化成功 备注: *************************************************************************/ extern "C" __declspec(dllexport) BOOL SP_InitComm(LPCTSTR lpComName); //初始化串口操作 /************************************************************************ 函数名称:SP_CloseComm 函数功能:关闭串口 返回值类型:无 意思: 备注:不在使用串口的时候可以关闭它。不然会造成下次使用出现问题 *************************************************************************/ extern "C" __declspec(dllexport) void SP_CloseComm(); /************************************************************************ 函数名称:SP_ReadComm 函数功能:读取串口数据 参数.一:tszDest In/Out:In/Out 可空:N 意思:要保存到的缓冲区,提供一个缓冲区 参数.二:dwWriteLen In/Out:In/Out 可空:N 意思:读取的预计大小,实际写出大小 返回值类型:逻辑型 意思:是否成功读取 备注: *************************************************************************/ extern "C" __declspec(dllexport) BOOL SP_ReadComm(TCHAR *pTszBuff,DWORD *pdwLen); /************************************************************************ 函数名称:SP_WriteComm 函数功能:异步发送串口数据 参数.一:tszData In/Out:In 可空:N 意思:要发送的数据字符串指针 参数.二:dwWriteLen In/Out:Out 可空:N 意思:实际发送的长度,可空 返回值类型:逻辑型 意思:是否发送成功 备注:如果错误你需要获取错误码来知道为什么错误 *************************************************************************/ extern "C" __declspec(dllexport) BOOL SP_WriteComm(TCHAR *pTszBuff,DWORD *pdwLen); /************************************************************************ 函数名称:SP_GetComCount 函数功能:获取当前系统有多少COM端口 参数.一:ComName In/Out:Out 可空:N 意思:Com字符串名称 返回值类型:int 意思:当前COM端口个数 备注:ComName会返回搜索到的最后一个COM端口名称,然后你可以根据序号来操作 *************************************************************************/ extern "C" __declspec(dllexport) DWORD SP_GetComCount(TCHAR *tszComNumber); //获取错误码 extern "C" __declspec(dllexport) DWORD SP_COM_GetLastError();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值