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

来源:互联网 发布:php 前后端分离怎么做 编辑:程序博客网 时间:2024/06/01 09:14

 利用ACE当中的包装类进行串口操作在ACE目录下的examples/IPC_SAP/DEV_SAP有例子做详细介绍。但是这里的例子是阻塞模式的。于是我试图使用ACE当中的一些框架来做一个异步的串口操作。

      ACE当中可以使用的异步操作框架有Reactor和Proactor等。Reactor采用Bridge模式有多个实现,在Windows下面默认的实现是ACE_WFMO_Reactor,他内部使用WaitForMuiltiObject来等待OVERLAPPED当中的event句柄,LINUX下使用ACE_Select_Reacotr实现,内部使用select函数来分配操作。当然在WINDOWS平台下我们也可以手动来指定使用ACE_Select_Reactor作为Reactor引擎的实现。然而在WINDOWS下select函数只能对socket句柄进行分配,因此我们不能使用这个实现的Reactor引擎来进行异步的串口操作。于是,我们开始考虑默认的ACE_WFMO_Reactor实现来进行异步串口操作的开发,但是这种实现当中他调用了WSAEventSelect,这是一个WIN SOCKET的API,当然他也只适用于SOCKET句柄。至此,我放弃了Reactor引擎,转而考虑Proactor引擎来实现异步操作串口的功能。

      Proactor引擎在WINDOWS上使用的是Completion Port,因此我们可以做一个合理的假设,Read/WriteFile这些函数可以用Completion Port来实现异步操作,而一个串口在WIN32 API当中用CreateFile打开然后用Read/WriteFile来进行读写操作,于是他应该能用Completion Port进行异步操作,并且也应该可以使用Proactor引擎来实现异步操作。经过查询相关文档和自己的一些试验,表明确实可以使用Proactor引擎来进行异步操作,但其中有几个要点:

1.使用ACE_DEV_Connector::connect来打开串口时,flag参数一定要加上FILE_FLAG_OVERLAPPED标志。

2.ACE_TTY_IO::Serial_Params当中的readtimeoutmsec字段对ACE_Handler最后的回调有一定的影响。如果设置一个大于等于零的值,那么无论有没有数据到达,ACE_Handler的相关read回调函数都会定时被回调一次,如果没有数据到达,那么result.bytes_transferred()为0;如果设置成-1,那么就没有超时,read回调也会只在有实际数据到达时才会被调用。

3.提交异步操作的两个Asynch_IO对象应该是ACE_Asynch_Read_File和ACE_Asynch_Write_File,用来提交的函数分别是read和write。

4.ACE_Handler当中用来表示操作完成的回调函数是handle_read_file和handle_write_file。

5.在handle_read_file被回调的时候特别要注意检查result.bytes_transferred()。可能会有接收到不完整的数据包的现象,这可能与你设置的ACE_TTY_IO::Serial_Params当中的readmincharacters字段有关。

6.其余部分与普通的proactor操作一致。

具体的步骤是:

1.初始化一个Proactor实例,并且运行Proactor事件循环。

2.使用ACE_Dev_Connector和ACE_Dev_Addr来打开一个串口,得到一个ACE_TTY_IO对象。

3.创建一个继承自ACE_Handler的对象,把2中的ACE_TTY_IO对象传给他。

4.ACE_Handler内部的ACE_Asynch_Read/Write_File对象使用ACE_TTY_IO::get_handle()以及3中的ACE_Handler对象初始化。

5.使用ACE_Asynch_Read/Write_File对象提交异步操作。

6.处理Proactor回调的handle_read_file和handle_write_file函数,并重新投递操作请求。

 

总结:

      ACE库给了我们很多方便的类,但是要想真正很好地使用它,我们还是需要了解操作系统的一些API的限制以及ACE底层的各种实现所包装的系统API,这个可以通过多看ACE源码的方式来进行提高。本文所说的方法是针对Windows平台的,在Linux平台下由于select函数没有那些限制,因此我们可以使用默认实现的Reactor引擎来进行异步的串口操作。

 

环境:

OS:Windows XP Service Pack 3

ACE: 5.6.9

IDE:Visual Studio 2005


原文地址:http://blog.csdn.net/phil2036/article/details/5710269