注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小哲

从今以后,你会是所有幸福的理由!

 
 
 

日志

 
 

WINDOWS API串口编程(二)  

2012-02-11 23:57:22|  分类: MFC初级 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

二、OVERLAPPED异步I/O重叠结构

在用ReadFileWriteFile读写串口数据时,既可以同步执行,也可以重叠执行,在同步执行时,韩式直到操作完成后才返回,这意味着在同步执行时线程会被阻塞,从而导致效率下降,在重叠执行时,即使操作还未完成,调用的函数也会立即返回,费时的IO操作在后台运行,这样线程可以干别的事情,在异步设置时,会用到OVERLAPPED结构

typedef struct _OVERLAPPED 

    ULONG_PTR Internal; 
    ULONG_PTR InternalHigh; 
    DWORD Offset; 
    DWORD OffsetHigh; 
    HANDLE hEvent; 
} OVERLAPPED; 
 

在串口通信编程过程中,与重叠IO操作关系最密切的是串口的读写操作,涉及的两个函数是ReadFileWriteFile,当ReadFileWriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果

在使用重叠IO时,线程需要创建OVERLAPPED结构以供读写函数使用,OVERLAPPED节诶狗最重要的成员是hEventhEvent是一个事件对象句柄,线程应该用CreateEvent函数为和Event成员创建一个手工重置事件,hEvent成员将作为线程的同步对象使用,如果读写函数未完成擦偶走就返回,那么就把和Event成员设置成无信号,操作完成后(包括超时),和Event会变成有信号的。

如果GetLastError函数返回ERROR_IO_PENDING,则说明重叠操作还未完成,线程等待操作完成,有两种等待办法:一种办法就是用像WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的和Event成员,可以规定等待的时间,在等待函数返回后,调用GetOverlappedResult,另一种办法是调用GetOverLappedResult函数等待,如果指定该函数bWait参数为TRUE,那么该函数将等待OVERLAPPED节诶狗的hEvent事件,GetOverlappedResult可以返回一个OVERLAPPED结构来报告包括实际传输字节在内的重叠操作的结果

如果规定了读写操作的超时,那么当超过规定时间后,hEvent成员会变成有信号的,因此,在超时发生后,WaitForSingleObjectGetOverlappedResult都会结束等待,WaitForSingleObjectdwMilliseconds参数会规定一个等待超时,该函数实际等待的时间是两个超时的最小值,注意GetOverlappedResult不能设置等待的时限,因此,如果hEvent成员无信号,则该函数将一直等待下去

以以上可以看出,异步IO操作有两种方法来获取结果

利用GetOverlappedResult函数

利用WaitForSingleObject等事件处理函数

以上两种结合起来使用

  评论这张
 
阅读(1134)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017