羅如為,陳威孝
(貴州大學計算機科學與信息學院,貴州貴陽 550025)
串口通信的一種通用模式
羅如為,陳威孝
(貴州大學計算機科學與信息學院,貴州貴陽 550025)
為了通過通信線路實現異地遠程數據的實時傳輸,提出一種基于串口通信的通用模式:首先應用 zlibEx對數據進行最大化壓縮,減少線路傳輸數據量及傳輸時間;在進行文件流壓縮時,加入 md5算法生成的加密口令,提高數據的安全性;最后根據自定義通信協議將壓縮后的文件通過串口進行遠程傳輸。
串口通信;通用模式;zlibEx壓縮;實時傳輸
zlib壓縮算法廣泛應用于各種數據的壓縮。例如壓縮數據庫或數據庫字段值[1],網絡中壓縮網頁數據或實驗數據[2],壓縮圖書館數字文獻[3],壓縮監測數據[4]等,使用最廣泛的是網絡視頻或遠程屏幕拷貝圖像的壓縮傳輸[5]。還有不少軟件的遠程更新也使用了 zlib壓縮。
zlib是用于數據壓縮的函數庫,zlib壓縮算法是一種基于字典的無損壓縮算法,當緩沖區中有與滑動窗口 (字符字典)的字符串相匹配的最長的字符串,將該字符串按照LZ77編碼,當兩個緩沖區中沒有相匹配的字符時,便根據字符出現的概率采用自適應的 Huffman編碼法進行編碼,以編碼代替字符串以達到壓縮目的,并且在編碼的過程中將已編好的壓縮碼實時地寫入壓縮文件中。zlib壓縮算法有機地結合了 Huffman樹編碼法和 LZ77編碼法的優點,去掉了壓縮文件時包含的一些冗余信息,提高了對緩沖區數據的壓縮速度,壓縮效果更好。
zlib經過不斷地修改和添加新的函數,已經改名并更新到現在的 ZlibEx 1.2.3和 ZlibExGZ 1.2.3。
md5是對一段信息產生信息摘要,以防止被篡改。通過 md5不可逆的字符串變換算法,把一個任意長度的字符串變換成一個定長的整數,所以采用 md5加密解壓縮所需要的口令,就算得到了壓縮文件也不能獲得原始口令,不能解壓縮文件[6]。
MSComm控件是微軟的 Visual Basic中提供的一個串口通信OCX控件。MSComm提供了各種與串口通信密切相關的屬性及事件,編程者只需改變MSComm控件的屬性設置和編寫相應的初始化程序。在 Delphi環境下進行串行通信編程,利用MSComm控件可以靈活地調用功能函數,使程序設計簡單、直觀,既保證了數據傳輸的實時性,又方便快捷[7]。
本文在 Delphi環境下首先采用最新的 zlibEx壓縮庫進行多文件或文件夾的最大化壓縮;利用MSComm控件和自定義通信協議將壓縮文件通過串口Modem實現遠程傳輸。這種傳輸模式 (數據采集——壓縮——串口發送——串口接收——解壓縮)可以推廣到其它需要通過串口傳輸的應用場合,從而作為一種通用模式得以廣泛應用。

圖1 文件壓縮和遠程傳輸流程圖
圖1為文件壓縮和遠程傳輸流程圖[8-9]。在 Delphi下,首先將選中的文件變換為文件流,對文件流進行 zlibEx流壓縮,并在壓縮流中加入加密信息和文件、文件夾信息形成完整的壓縮文件;將壓縮文件按照自定義通信協議分組打包,通過MSComm控件讀寫串口、并用 AT指令控制Modem,將壓縮文件完整快速地發送到遠程接收方。接收方對收到的數據幀組合成完整的文件,轉換為文件流,并提取加密信息和文件、文件夾信息,并根據加密口令判斷是否正確解壓。如果有口令,并且口令正確則將文件流進行zlibEx流解壓縮,得到壓縮前的文件、文件夾。
要在Delphi下完成多文件的壓縮,首先將選擇的文件、文件夾生成一個列表。針對列表中的文件、文件夾分別由以下四種方式處理:如果是非 0字節文件,則記錄文件名和文件大小,并將文件進行 zlibEx流壓縮;如果是 0字節文件,則只記錄文件名和文件大小,不做壓縮處理;如果是空文件夾,則只記錄文件夾名,不做進一步處理;如果是非空文件夾,則用遞歸方法搜索下一級目錄,對于搜索結果仍按上述四種方式處理,直至完全遍歷所有子目錄。
根據以上四種情況的處理,得到所有文件、文件夾信息和所有文件的壓縮流。
為了保證正常解壓縮,需要約定壓縮文件的結構。圖2定義的是加密壓縮的文件流結構圖[8]。加密信息部分包括壓縮庫標識、是否加密標識、md5加密后的口令;文件夾信息只記錄空文件夾的名稱;文件信息包括文件名和文件流大小;最后一部分是所有文件的壓縮流。

圖2 加密壓縮的文件流結構圖
在解壓縮的時候,從文件流中讀入壓縮庫標識,如果不是本程序產生的文件不可解壓;如果壓縮庫標識正確,則判斷讀入的加密標識,如果已經加密,并且提供的密碼不正確,則不允許解壓縮。如果沒有加密或者已經加密而且解壓縮密碼也正確,則根據文件夾、文件信息判斷,如果是空目錄或空文件,則直接創建文件夾、0字節文件,否則根據文件大小解壓縮文件流,創建出壓縮前的文件。
zlibEx壓縮代碼如下:
instream:=TFileStream.Create(mFileName,fmOpen-Read or fmShareExclusive);
ZCompressStream(instream,mStream,zcMax);
instream是由 mFileName指定的文件創建的文件流,函數 ZCompressStream是進行 zlibEx流壓縮,壓縮后的流保存在內存流 mStream中,為了充分減少傳輸時間,所以壓縮級別選擇最大 zcMax。
zlibEx解壓縮代碼如下:
outStream:=TFileStream.Create(mFileName,fmCreate);
ZDeCompressStream(mstream,outStream);
outStream是要創建mFileName指定名字的新文件的文件流,通過函數 ZDeCompressStream將 mstream中的壓縮流釋放到 outStream中。
通過以上的方法,實現多文件 (夾)的加密壓縮和解壓縮。當然也可以壓縮單一的文件。
利用MSComm控件讀寫串口、向Modem發送 AT指令來實現遠程傳輸,則必須首先熟知MSComm控件的屬性和事件。
在MSComm的 PortOpen設置為 True,也就是打開串行端口之前,先初始化MSComm,將一些參數設置完成,如:
1)CommPort:設置串行端口號,可以設置為 1到 16之間的任何值,缺省值為 1。但是如果用 PortOpen打開一個并不存在的端口時,MSComm控件會產生錯誤 68(設備無效)。
2)Setting:設置串口通信參數——波特率、奇偶校驗、數據位、停止位參數。
3)Inpu tMode:設置 0,從接收緩沖區讀取文本形式的數據。
4)RThreshold:設置 1,當接收緩沖區內字節個數達到或超過 1就會產生OnComm事件。
5)SThreshold:設置 0,MSComm控件在發送數據時不會產生OnComm事件。
6)InBufferSize:設置接收緩沖區的大小,缺省值為1024字節。
7)InBufferCount:返回接收緩沖區內等待讀取的字節數,可設置為 0清空接收緩沖區。
8)Ou tBufferSize:設置發送緩沖區的大小,缺省值為512字節。
9)Ou tBufferCount:返回發送緩沖區內等待發送的字節數,可設置為 0來清空發送緩沖區。
10)InputLen:設置為 0,Input讀取接收緩沖區中全部的內容。
本文采用MSComm控件的事件驅動通信方式:當串口發送或接收到數據時,利用MSComm控件 OnComm事件捕獲并處理這些通信事件。如果在通信過程中發生錯誤或異常,也會觸發 OnComm事件,通過 CommEvent屬性反映錯誤類型,在通信程序的設計中可根據該屬性值來執行不同的操作。
發送文件之前,必須建立通信連接。所以利用MSComm控件向串口Modem發出控制命令,例如:
1)撥號:’ATDT’+電話號碼 +#13
2)掛機:’+++’+#13+’ATH0’+#13
3)自動應答:’ATS0=1’+#13
當撥號后成功建立連接,則開始發送文件。為了順利地發送文件,需定義好通信協議并將待發送數據按協議組包。
如圖 3、圖 4定義通信數據幀 (信息幀)的一般格式。

信息幀格式的說明:
命令字:區分不同的操作,如:準備發送文件、發送數據、發送數據完畢、準備接收文件、已接收數據、已保存文件。
驗證碼:檢驗信息幀是否屬于同一個文件的發送。
校驗碼:判斷信息幀是否完整。

圖5 串口發送文件信息流程圖
接收方接收到發送方的信息幀后,首先核對幀的大小是否符合協議約定的幀大小,如果不一致,則拋棄該信息幀。如果幀大小正確,則校驗該信息幀是否正確,如果信息幀校驗失敗,則接收方拋棄該信息幀。發送方等待接收方的反饋信息,如果在指定的時間未接收到反饋信息,發送方重發信息幀。如果信息幀校驗正確,則接收方將正確接收信息幀的消息發給發送方作為反饋信息,并對信息幀進行相應的處理。發送方接收到反饋信息,進行校驗,如果校驗成功則表示信息幀發送成功,繼續發送下一個信息幀,否則需要重發信息幀。
圖5為串口發送文件流程圖。通過初始化MSComm,分別對串口和Modem進行初始化,如果發現串口或者Modem出錯,向用戶提示出錯信息。如果初始化成功,則進行撥號嘗試建立通信鏈路,如果連接不成功,則自動重撥,如果超出重撥次數則向用戶提示出錯。當建立連接后,將待發送的壓縮文件讀入文件流,計算出流的總長度,并按照通信協議劃分文件流組成系列信息幀,向接收方發送,如果發送成功,則繼續發送下一個幀;如果超時,則重發。直到整個壓縮文件發送完畢。
最后結論是:將增加了加密口令的壓縮文件用在串口傳輸上,在一定程度上增加了傳輸的安全性。而文件的最大化壓縮減少了傳輸的數據字節數,減少了傳輸的時間消耗,實現傳輸實時性。另一方面實現靈活選擇用于壓縮傳輸的文件,可以是單文件,也可以是多文件、多文件夾的混合。這種壓縮后進行傳輸的模式,可廣泛應用于遠程監測設備的數據采集、連鎖門店的數據匯總等方面。所以可以作為串口通信的一種通用模式進行推廣。
[1]魏崢,萬珊.用 Delphi實現對庫文件的壓縮解壓[J].濟南大學學報 :自然科學版,2002,16(3):313-314.
[2]左繼紅,霍劍青,吳葛銘,等.虛擬物理實驗的遠程教學交互和管理系統 [J].中國科學技術大學學報,2000,30(3):307-311.
[3]汪勇,楊濤,高偉,等.汽輪機組振動波形數據高效實時無損壓縮算法[J].華中科技大學:自然科學版,2008,36(9):86-89.
[4]彭偉.局域網圖像廣播及相關遠程控制的設計與實現[D].武漢:華中師范大學計算機科學系,2006.
[5]孫萍.基于 ZLib的數字文獻壓縮技術的設計與實現[J].農業圖書情報學刊,2007,19(11):5-8.
[6]蘭順碧,彭晶晶.醫學多媒體在線考試系統的設計與實現[J].網絡安全技術與應用,2006(4):60-62.
[7]黃軍,熊勇,劉燕,等.Delphi串口通信編程 [M].北京:人民郵電出版社,2002.
[8]wnhoo.用DELPHI實現文件加密壓縮[EB/OL].http://dev.csdn. net/author/Jason009/0e90c8556a414b2790df1e2de9a723e5.html,2007-07-13.
[9]王保印,康健,姜傳國.用 VC++6.0中 MSComm控件實現多類型文件傳送[J].吉林大學學報:信息科學版,2004,22(2):164-168.
(責任編校:光明)
A CurrentMode of Serial Communication
LUO Ru-wei,CHEN W ei-xiao
(College of Computer Science and Information,Guizhou University,Guiyang,550025,China)
To implement real-time transmit long-distance data by communication line,a currentmode of serial communication is presented.Firstly,the data are maximally compressed with the latest zlibEx,and in the process of compression,the encrypted pass word usingmd5 is added,so the security of data can be enhanced.Finally,a series of communication protocols are designed to realize the remote trans missing via serial port.
serial communication;currentmode;compressingwith zlibEx;real-time trans missing
TP311
A
1673-0712(2010)02-0014-03
2010-02-08.
羅如為 (1974-),男,湖南邵東人,貴州大學計算機科學與信息學院在讀博士,研究方向:數字圖像處理、虛擬現實;陳孝威(1945-),男,貴州貴陽人,貴州大學計算機科學與信息學院教授,博士生導師,CCF會員 (E20-0005528S),研究方向:虛擬現實、數字圖像處理及網絡通信技術。