图2线程通信实现传真输流程图 (1) 创建线程 m_commctrl = (CCommCtrl*)AfxBeginThread (RUNTIME_CLASS(CCommCtrl),THREAD_PRIORITY_NORMAL,0,REATE_SUSPENDED); 其中m_commctrl为CCommCtrl对象,CCommCtrl为CWinThread派生对象的RUNTIME_CLASS,THREAD_PRIORITY_NORMAL为线程的优先级,CREATE_SUSPENDED表示线程的创建形式为挂起。 (2) 打开串口和配置串口 1)用CreateFile函数打开串口资源。CreateFile的函数原型为: HANDLE CreateFile(LPCTSTR lpFileName, //指向串名的指针,如"COM2";DWORD dwDesiredAccess, //访问模式,可以有是读或写或都是;DWORD dwShareMode, //共享模式,对于通信资源,只能为0;LPSECURITY_ATTRIBUTES lpSecurityAttibutes, //指向安全模式描述符的指针;DWORD dwCreationDistribution, //对于通信资源,它必须为OPEN_EXISTING;DWORD dwFlagsAndAttributes, //指定属性和标志;HANDLE hTemplateFile //模板文件句柄,对于通信资源,必须为0) 如果函数调用成功,则返回指定通信资源的一个打开的句柄;否则返回INVALID_HANDLE_VALUE。 2)用GetCommState函数获取串行资源的当前配置,再使用SetCommState函数重新配置串行资源各参数。然后再用SetupComm函数来设置缓冲区大小。 3)当以上都完成后,就可以用ReadFile和WriteFile来进行串口数据的读写了。 (3)通信事件 1)设置事件掩模 通过SetCommMask函数建立事件掩模来监视指定通信资源上的事件,其原型为: BOOL SetCommMask (HANDLE hFile, //通信设备句柄,由CreateFile返回;DWORD dwEvtMask //被监视的事件) 2)监视通信事件 在指定被监视的事件掩模之后,进程使用WaitCommEvent函数等待其中一个事件发生。WaitCommEvent的原型为: BOOL WaitCommEvent ( HANDLE hFile, //通信设备句柄,由CreateFile返回;LPDWORD lpEvtMask, //指向存放当前发生事件的变量;LPOVERLAPPED lpOverlapped // 指向一个LPOVERLAPPED结构) (4)重叠I/O操作 重叠操作使得线程从费时的I/O操作中解脱出来,让I/O操作在后台执行,而线程可以自由执行其它任务。当使用重叠操作时,I/O操作不管是否完成都立即返回。 如果要想通信设备能执行重叠操作,必须在使用CreateFile打开通信设备时, dwFlagsAndAttributes参数必须指定为FILE_FLAG_OVERLAPPED与其它标志的组合。同时要按重叠操作执行的函数,其参数中必须指定指向OVERLAPPED结构的指针,最后,OVERLAPPED结构必须包含手工重置事件对象。 5 结束语 利用线程事件方式来实现串行通信,能够很好地解决传真的实时接收和发送数据,同时也能保证扩展ASCII字符和ASCII 0的正确传输,这种方法不仅可以用在传真系统中;也可用在那些需要实时传输数据的串行通信场合,如监控系统;也可用在文件传输,尤其是所传输的文件是图象文件等其它二进制文件。 作者单位:长沙铁道学院信息技术研究中心,长沙410075 参考文献 1 [日]通信协议手册编委会编.最新网络通信协议手册.北京:电子工 业出版社,1999 2 [美]Galtan P W.精通串行通信.北京:电子工业出版社,1994 3 [美]Holmes M,Flanders B.C++通信实用程序.北京: 电子工业出 版社,1995 4 [美]Leinedker R C.Windows 98 编程实用大全.北京:中国水利水 电出版社,1999 |