做过串口通讯的VCer肯定都熟悉MsComm控件和CodeProject上的CSerial。也许更多的程序员更愿意使用不需要控件的CSerial。但是不幸的是,CSerial类仅仅完成对底层串口通讯的封装,有时候并不如MsComm控件好用。
CSerialPort为bluejoe在CSerial基础上开发的类,支持开启事件监视线程。CTaskedPort为CSerialPort的派生类,它支持基于任务的事件处理。
用户发送一条命令(如:AT<cr>),可能就需要等待串口的回应(如:OK)才决定做下一步,这个AT命令其实就是一项任务(CPortTask),任务的结束一般需要用户指定关键词(如:OK或者ERROR)。CTaskedPort自动将命令和关键词列表封装成一个任务。
本包主要包括以下几个类:
CSerialPort:类似于CSerial的类,类声明如下:
CPortTask:完成对串口任务的封装,类声明如下:
CTaskedPort:支持任务的串口操作类,类声明如下:
CTaskedPort支持的任务包括后台任务和前台任务,它同时只允许一个任务被激活:如果存在前台任务,后台任务自动隐藏;新前台任务的载入,会自动覆盖旧的任务。
后台任务一直存在,用以监视用户指定的串口事件,并构造字符缓冲区。当用户调用Request函数时,CTaskedPort自动创建一个前台任务,并disable后台监视任务。前台任务一直等待,直到关键字的出现(或者超时)。这个等待过程表现出来的是一个同步接口,用户只需要等待Request函数结束即可。至于用户可能需要在等待过程中做一些其它的操作,如:显示进度条,这就需要用到CWaiting类。
CWaiting:CWaiting类用以指定等待过程中的动作,系统中已提供了3种CWaiting类:CDumbWaiting(啥都不干)、CProgressWaiting(显示进度条)和CNewProgressWaiting(创建一个新的进度窗口并显示进度)。CNewProgressWaiting继承于CProgressWaiting,它们之间的区别在于CProgressWaiting可以依附于任何一个窗口(如:当前的主窗口),而CNewProgressWaiting创建一个新的窗口。
创建一个CWaiting对象,将它作为参数,传入Request函数,就这么简单,你的程序就完成了同步等待和异步显示。
此外,Request允许用户指定等待时限。在等待超时时,是否直接结束等待,还是继续重试,还是弹出提示框询问用户,这些动作都可以通过Request的参数指定。
CTaskedPort还提供了丰富的接口,用户可以通过继承,来实现更多的功能。
本包已经成功应用到bluejoe的手机串口通讯软件,目前还没有发现什么问题。希望各位使用探讨,并希望各位提出修改意见。
所附源码还包括其它的工具类,包括CUtil、CRichException、CWin32Exception等,希望能与大家一块共享。