l轉載:計算機傳真中串行通信的研究與實現

計算機傳真中串行通信的研究與實現

彭愛國 李建華

  在現代社會中,傳真傳輸已成爲遠程通信領域的主要工具之一,而隨着計算機通信及網絡技術的發展,傳真傳輸不再只限於專用的傳真機,事實上,利用計算機和傳真調制解調器實現傳真功能已經得到了越來越廣泛的應用。
  設計傳真軟件的最基本也是最關鍵的一部分就是串行通信,串行通信的正確與否直接關係到傳真是否能正確接收與發送。

1 計算機傳真的工作原理
  計算機傳真的基本思想是在串行通信的基礎上,利用計算機、Fax Modem和電話,根據T.30和T.4兩個協議來模擬傳真機,實現所有傳真功能。其中T.30爲傳真通信協議,它規定了一次傳真會話的過程:首先,兩個調制解調器將建立一個在PSTN上的電話連接;然後,通過在一個300bps(可選爲2400bps)半雙工同步連接上交換HDLC信息幀,這兩個調制解調器將實現一個帶差錯控制的T.30"會話";第三,在會話的起始部分,兩個調制解調器贊同可接受的參數,這時,發送方將發出一個高速載波脈衝,以驗證電話線路的質量,然後,兩個調制解調器都將切換到一個高速狀態,從而以半雙工方式一次一頁傳輸圖象;第四,在每頁的結束處,調制解調器回到一個較低速(通常爲300bps)會話協議,以協商下一頁(如有必要,也可協商重發上頁);最後,當無更多頁發送時,調制解調器斷連。T.4爲傳真圖象協議,它規定了T.30中階段C中數據的尺寸和編碼規範,如傳真文件的尺寸、掃描儀/打印機的分辨率、爲壓縮數據而採用的編碼算法、帶行同步序列,即行終碼EOL、階段C的帶內轉義序列,即返回控制信號RTC,以及適應低速輸出設備所需要的填充技術等。

2 傳真與數據傳輸的差別
  (1) 傳真站之間傳送的所有數據均爲圖象數據,在交互式對話過程中傳送於主系統和遠地站之間。
  (2) 傳輸單元的不同。在XModem或YModem協議中,包是傳輸單元,而在傳真傳輸中,使用的術語是幀或HDLC(高級數據鏈路控制)幀。傳真數據的最小單元是頁。
  (3) 數據通信一般是面向字節進行傳輸的,而傳真傳輸是面向比特流的,一頁上描述數據的信息是一系列可變長的位串。從計算機的角度來看,這些位串是被當作一系列字節來接收和發送的,位串的每一位在接收時都要被解釋直到它在T.4描述傳真數據的表中遇到某一匹配字串時爲止。

3 傳真中串行通信的幾種方法
  利用Fax Modem 和計算機模擬傳真機進行傳真的接收與發送,是在串行通信的基礎上加上對Modem的操作,根據T.30和T.4協議來實現的。Windows中有以下幾種常用的串行通信方法:
  (1) 查詢法
  Windows 3.1、Win95/98環境下的查詢通信方式的基本編程思想基本一致,採用CPU定時查詢,檢測是否接收到新的數據或數據是否發送完畢,其基本的程序結構如圖1。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

1查詢方式實現傳真傳輸框圖

  (2) 利用通信控件
  在Windows3.1下,VB3.0提供了VBX控件MSCOMM.VBX,VC1.0/1.5的類庫提供了CVBControl類,使得應用程序可以方便地處理VBX控件。 在Win95/98下,從VC2.0起,捨棄了VBX控件,逐步由OLE控件和ActiveX控件取而代之,與通信VBX控件MSCOMM.VBX相對應通信OLE控件爲MSCOMM16.OCX(16位)和MSCOMM32.OCX(32位)。
  (3) 線程事件驅動方式
  在Windows 3.1下,當設置通信事件後,每次指定的通信事件發生時,通信驅動程序將自動向應用程序發送通信通知消息WM_COMMNOTIFY,它指示了一個窗口的發送和接收緩衝區的狀態。 Win95/98通信機制與Windows3.1有很大差異,不再有WM_COMMNOTIFY通知消息,爲了實現中斷通信,Win95/98提供了線程處理方法,使得程序員能夠完全控制程序片斷的執行,進行實時收發數據。
  用方法1實現傳真通信十分簡單,但耗時、效率不高,故此方法不能做到實時收發數據,容易引起數據的丟失。方法2使用通信控件,大大簡化了通信編程,可通過其提供的通信事件來進行實時收發數據,並提供了大量的屬性和方法,用於普通的串行通信不失爲一種較好的方法,但該方法對擴展ASCII字符和ASCII 0(也就是該字符的ASCII值爲0)的傳送會顯得力不從心,不能正確完成數據傳輸,而在傳真應用程序中,傳真中的傳輸單元幀中的許多標誌字有的就是擴展ASCII,傳真數據是圖象數據經過編碼之後進行傳送的,是一種面向比特流的數據,因而在傳送的數據中,是會經常碰到擴展ASCII字符和ASCII 0的,因而這種方法也不適合用於串行數據的傳輸。方法3克服了上述幾種方法的不足,具有高效率、準確性好、能滿足傳真傳輸的基本要求。

4 線程事件方式的實現
  在Win95/98環境下,線程是唯一執行單位,是Win32爲程序分配CPU時間的基本實體。每個正在運行的應用程序構成一個進程,每個進程包括一個或多個線程,各線程協同完成指定操作,應用程序中的進程是作爲單獨的線程開始它的生命期的。MFC將執行的線程封裝在CWinThread類中,包括創建、管理和刪除線程的一系列成員變量和成員函數。
  線程通信方式的主要思路是單獨創建一個通信線程,它主要實現對通信事件的監視,如檢測重疊I/O操作是否完成以及是否接收到新的數據等。
  爲了便於維護,把串口通信設計成一個類CCommCtrl,它實現了諸如打開串口、配置串口、向串口發送數據、關閉串口等方法,同時還完成通信事件的監視。
  當進程啓動之後,首先創建主線程,然後創建通信線程,並將其掛起,再調用類CCommCtrl中的成員函數完成串口的初始化、創建同步對象、設置事件掩模等,然後在合適的時候繼續執行通信線程,由其完成通信事件的監視。每當有通信事件時,就向主線程發送自定義消息。圖2是主要流程。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章