


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、串行通信与重叠 (异步 )IOWin 32 系统把文件的概念进行了扩展。无论是文件、通 信设备、命名管道、邮件槽、磁盘、还是控制台,都是用 API 函数 CreateFile 来打开或创建的。该函数的声明为:HANDLE CreateFile(LPCTSTR lpFileName,/ 文件名DWORD dwDesiredAccess,/ 访问模式DWORD dwShareMode,/ 共享模式LPSECURITY_ATTRIBUTES lpSecurityAttributes,/ 通常为 NULLDWORD dwCreationDistribution, / 创建方式DWORD dwFlags
2、AndAttributes,/ 文件属性和标志HANDLE hTemplateFile/ 临时文件的句柄,通常为 NULL);如果调用成功,那么该函数返回文件的句柄,如果调用 失败,则函数返回 INV ALID_HANDLE_V ALUE 。在打开通信设备句柄后,常常需要对串行口进行一些初 始化工作。这需要通过一个 DCB 结构来进行。 DCB 结构包 含了诸如波特率、每个字符的数据位数、奇偶校验和停止位 数等信息。在查询或配置置串行口的属性时,都要用 DCB 结构来作为缓冲区。调用 GetCommState 函数可以获得串口的配置,该函数 把当前配置填充到一个 DCB 结构中。 一般在用 C
3、reateFile 打 开串行口后,可以调用 GetCommState 函数来获取串行口的 初始配置。要修改串行口的配置,应该先修改 DCB 结构, 然后再调用 SetCommState 函数用指定的 DCB 结构来设置串 行口。除了在 DCB 中的设置外, 程序一般还需要设置 I/O 缓冲 区的大小和超时。 Windows 用 I/O 缓冲区来暂存串行口输入 和输出的数据,如果通信的速率较高,则应该设置较大的缓 冲区。调用 SetupComm 函数可以设置串行口的输入和输出 缓冲区的大小。在用 ReadFile 和 WriteFile 读写串行口时, 需要考虑超时 问题。如果在指定的时间内没
4、有读出或写入指定数量的字 符,那么 ReadFile 或 WriteFile 的操作就会结束。 要查询当前 的超时设置应调用 GetCommTimeouts 函数,该函数会填充一 个 COMMTIMEOUTS 结构。调用 SetCommTimeouts 可以用 某一个 COMMTIMEOUTS 结构的内容来设置超时。有两种超时:间隔超时和总超时。间隔超时是指在接收 时两个字符之间的最大时延,总超时是指读写操作总共花费 的最大时间。写操作只支持总超时,而读操作两种超时均支 持。用 COMMTIMEOUTS 结构可以规定读 /写操作的超时, 该结构的定义为:typedef struct _COMM
5、TIMEOUTS1DWORD ReadIntervalTimeout;/ 读间隔超时系数DWORD ReadTotalTimeoutMultiplier;/ 读时间常量DWORD ReadTotalTimeoutConstant;/ 读时间系数DWORD WriteTotalTimeoutMultiplier;/ 写时间常量DWORD WriteTotalTimeoutConstant;/ 写时间 COMMTIMEOUTS,*LPCOMMTIMEOUTS;COMMTIMEOUTS 结构的成员都以毫秒为单位。总超时的计算公式是:总超时=时间系数X要求读/写的字符数 +时间常量例如,如果要读入 1
6、0 个字符,那么读操作的总超时的 计算公式为: 读总超时=ReadTotalTimeoutMultiplier X 10 + ReadTotalTimeoutConstant可以看出,间隔超时和总超时的设置是不相关的,这可 以方便通信程序灵活地设置各种超时。如果所有写超时参数均为0,那么就不使用写超时。如果 ReadIntervalTimeout 为 0,那么就不使用读间隔超时,如 果 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都为 0,则不使用读总超时。如果读间隔超时被设置成 MAXDWORD 并且两个读总超时为0,那么在读一
7、次输入缓冲区中的内容后读操作就立即完成,而不管是否读入了要求 的字符。在用重叠方式读写串行口时, 虽然 ReadFile 和 WriteFile 在完成操作以前就可能返回,但超时仍然是起作用的。在这 种情况下,超时规定的是操作的完成时间,而不是 ReadFile 和 WriteFile 的返回时间。在用 ReadFile 和 WriteFile 读写串 行口时,既可以同步执行,也可以重叠(异步)执行。在同 步执行时,函数直到操作完成后才返回。这意味着在同步执 行时线程会被阻塞,从而导致效率下降。在重叠执行时,即 使操作还未完成,调用的函数也会立即返回。费时的 I/O 操 作在后台进行,这样线程
8、就可以干别的事情。例如,线程可 以在不同的句柄上同时执行 I/O 操作,甚至可以在同一句柄 上同时进行读写操作。 “重叠”一词的含义就在于此。ReadFile 函数只要在串行口输入缓冲区中读入指定数量 的字符, 就算完成操作。 而 WriteFile 函数不但要把指定数量 的字符拷入到输出缓冲中,而且要等这些字符从串行口送出 去后才算完成操作。ReadFile 和 WriteFile 函数是否为执行重叠操作是由 CreateFile 函数决定的。 如果在调用 CreateFile 创建句柄时指 定了 FILE_FLAG_OVERLAPPED 标志,那么调用 ReadFile 和 WriteFi
9、le 对该句柄进行的读写操作就是重叠的, 如果未指 定重叠标志,则读写操作是同步的。函数 ReadFile 和 WriteFile 的参数和返回值很相似。 这里 仅列出 ReadFile 函数的声明:BOOL ReadFile(HANDLE hFile, / 文件句柄LPVOID lpBuffer, / 读缓冲区DWORD nNumberOfBytesToRead,/ 要求读入的字节数LPDWORD lpNumberOfBytesRead, / 实际读入的字节数OVERLAPPED 结构);/ 若返回 TRUE则表明操作成功需要注意的是如果该函数因为超时而返回,那么返回值 是 TRUE 。参数
10、 lpOverlapped 在重叠操作时应该指向一个 OVERLAPPED 结构,如果该参数为 NULL ,那么函数将进 行同步操作,而不管句柄是否是由 FILE_FLAG_OVERLAPPED 标志建立的。当 ReadFile 和 WriteFile 返回 FALSE 时,不一定就是操 作失败,线程应该调用 GetLastError 函数分析返回的结果。 例如,在重叠操作时如果操作还未完成函数就返回,那么函 数就返回 FALSE ,而且 GetLastError 函数返回 ERROR_IO_PENDING 。在使用重叠 I/O 时,线程需要创建 OVERLAPPED 结构 以供读写函数使用。
11、 OVERLAPPED 结构最重要的成员是 hEvent ,hEvent 是一个事件对象句柄, 线程应该用 CreateEvent 函数为 hEvent 成员创建一个手工重置事件, hEvent 成员将作 为线程的同步对象使用。如果读写函数未完成操作就返回, 就那么把 hEvent 成员设置成无信号的。 操作完成后 (包括超 时), hEvent 会变成有信号的。如果 GetLastError 函数返回 ERROR_IO_PENDING ,则 说明重叠操作还为完成,线程可以等待操作完成。有两种等 待办法:一种办法是用象 WaitForSingleObject 这样的等待函 数来等待 OVERL
12、APPED 结构的 hEvent 成员,可以规定等待 的时间,在等待函数返回后,调用 GetOverlappedResult 。另 一种办法是调用 GetOverlappedResult 函数等待, 如果指定该 函数的 bWait 参数为 TRUE ,那么该函数将等待 OVERLAPPED 结构的 hEvent 事件。 GetOverlappedResult 可以返回一个 OVERLAPPED 结构来报告包括实际传输字节 在内的重叠操作结果。如果规定了读 / 写操作的超时,那么当超过规定时间后, hEvent 成员会变成有信号的。因此,在超时发生后, WaitForSingleObject 和 GetOverlappedResult 都会结束等待。 WaitForSingleObject 的 dwMilliseconds 参数会规定一个等待 超时,该函数实际等待的时间是两个超时的最小值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度文化旅游地产项目房屋及土地所有权转让协议
- 二零二五年度高校毕业生就业安置与就业服务保障合同
- 二零二五年度车库购置与车位共享运营协议
- 二零二五年度玉米种植补贴收购合同
- 二零二五年度廉洁合作协议:公共资源交易项目监管合同
- 二零二五年度饲料行业风险评估与保险合同
- 二零二五年度旅游度假区招商代理专项协议
- 二零二五年度少儿教育讲师聘用合同
- 二零二五年度高校离退休教师兼职返聘协议
- 二零二五年度瑜伽教练职业培训聘用协议
- 现代家政导论-课件 4.1.3认识我国家政教育发展
- 四年级语文下册 第一单元 字词专项练习 (含答案)(部编版)
- 2024版2024年《汽车文化》全套教案
- 建筑垃圾清理运输服务方案
- 商业街委托运营合同范本
- 2024年部编版六年级语文上册第六单元 语文园地六(教案)
- 诺如病毒的护理
- 三年级下册语文核心素养教案电子版
- 中考英语688高频词大纲词频表
- 计算机基础教程电子版
- 财务管理学(第10版)课件 第3章 财务分析
评论
0/150
提交评论