圖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 |