李緒凱 王文娟
摘要:針對有線串口通信傳輸距離受限的問題,提出了一種基于P900無線串口通信模塊的無線文件傳輸系統。從系統的硬件連接、Visual C++2010環境下MSComm控件的應用及通信協議的制定三方面對系統的設計進行介紹,給出了具體的串口配置、發送和接收的軟件程序設計。經試驗表明,該系統穩定可靠、方便實用且傳輸距離較遠,具有較好的推廣作用。
關鍵詞:無線;串口通信;MSComm控件;文件傳輸
中圖分類號:TP312文獻標志碼:A文章編號:1008-1739(2018)07-62-3
Design on Files Transmitting System Based on Wireless Serial Port Module
LI Xukai1,WANG Wenjuan2
(1.The 54th Research Institute of CETC, Shijiazhuang Hebei 050081, China; 2. Shijiazhuang Campus, Army Engineering University, Shijiazhuang Hebei 050003, China)
0引言
串口通信是一種較為簡單的計算機通信方式,將2臺計算機的串口進行三線連接,僅使用接收數據引腳2(RXD)、發送數據引腳3(TXD)和信號地線引腳5(SG)就可完成硬件搭建[1-2],但是這種有線傳輸方式的傳輸距離受到串口線長度的限制。采用無線串口通信模塊作為無線數據傳輸的硬件基礎,從根本上克服了有線傳輸的不足和傳輸場地的限制,使用方便靈活[3]。
利用可視化程序設計工具Visual C++ 2010,通過權衡3種串口通信方法的優缺點,最終確定以MSComm控件進行串口通信的底層操作,在此基礎上進行軟件的設計與編程實現。在數據收發基礎上,通過制定簡單的通信協議,完成了文件的無線串口傳輸。
1基本設計
1.1硬件連接
硬件模塊采用成都某公司生產的P900無線串口通信模塊代替傳統的RS232串口,實現串口數據的無線收發。該模塊工作頻率為908~928MHz,采用的跳頻技術(Frequency-Hopping Spread Spectrum,FHSS)可實現可靠的遠距離無線異步數據傳輸,支持點對點、點對多點的通信模式,具有即插即用的優點,使用方便。
為簡化設計,應用2組P900無線串口通信模塊與計算機連接,實現點對點的文件收發功能,具體硬件連接如圖1所示。發送數據時,按照一定的通信協議格式,將文件數據通過計算機的RS232串口發送到與之相連接的無線串口通信模塊的數據口,無線串口通信模塊將數據進行校驗后,按照自身的無線通信協議將數據進行打包,通過天線發送出去。同時,如果無線串口通信模塊監聽到無線數據,首先判斷數據是否符合該模塊的無線通信協議,若判斷為系統內數據,則將數據進行解碼,再通過數據口發送至計算機的RS232串口,通過計算機解析出文件。需要說明的是,通常設計該無線串口通信模塊嵌入到計算機的內部,天線位于計算機外部。
1.2軟件介紹
Visual Studio 2010開發代號為“Rosario”,與Visual Studio 2008相比有了巨大的變化。帶來了增強的用戶界面體驗、更有條理的應用程序生命周期管理及更多的數據庫支持等。特別是在C++開發方面帶來了革命性的變化,這一變化也是伴隨著C++新標準的公布而產生的。
在Visual C++ 2010下默認的工具箱里沒有串口通信控件,要進行串口收發程序的設計與開發,首先要下載和注冊控件,主要有以下2種控件選擇。
①PComm:該軟件包是由第三方廠商MOXA公司提供的串口通信程序模塊。下載pcomm.h和pcomm.lib兩個文件,復制到項目目錄并引用,將pcomm.dll庫文件拷貝到Windows/System32下,即可進行函數的調用,實現方便。但是要實現收發數據的實時監控,需進行多線程的程序開發,編程復雜。
②MSComm串口通信控件[4]:如果安裝了VC6.0,就能在/Windows/System32下找到MSComm32.OCX、MSComm32.SRG和MSComm32.DEP三個文件。如果沒有安裝VC6.0,可以去CSDN網站下載,并按照說明完成控件的安裝和注冊。在VS2010環境下創建基于對話框的MFC應用程序后,需要在工具箱選項中的COM組件屬性頁下勾選Microsoft Communications Control項,工具箱中出現黃色電話圖標,表明控件添加成功。MSComm串口收到數據后觸發事件,有利于串口數據的實時接收,且編程較簡單。
除下載控件外,實現串口數據傳輸的另外一種方法是調用API函數,但是這種方法需要聲明和調用多個函數,編程繁瑣且收發數據功能較弱。對比以上幾種方法,本設計采用MSComm串口通信控件。
1.3通信協議
為了驗證硬件系統與軟件設計的可靠性,只制定了涉及串口數據的發送格式,一般格式及舉例如表1所示。
在發送文件時,需要發送文件名,以便接收端可以得到默認的文件名。開始標志1表示文件名的起始,結束標志1表示其結束;開始標志2表示文件中數據的起始,結束標志2表示其結束,為了保證遠距離傳輸時的數據可靠性,還應對數據進行編碼,得到校驗位。例如發送的文本文件名為“實驗.txt”,文本內容為“hello”,則無校驗時的串口發送數據將為“sname實驗.txtenamesfile hello efile”。接收端收到數據后根據上述格式將文件名與數據進行恢復。
2程序設計及實現
軟件設計主要包括串口配置、發送文件和接收文件。
2.1串口配置
MSComm串口通信控件封裝了串口屬性及基本數據傳送的方法。串口配置主要是對串口進行初始化,包括設置串口的工作狀態、數據格式、串口參數(波特率、有無奇偶校驗、停止和數據位)及緩沖區大小等。主要的串口配置程序如下:
nSel = m_comNum.GetCurSel();//獲取組合框控件的列表框中選中項的索引
m_ctrlComm.put_CommPort(nSel+1);//選擇串口號(列表框的索引號是從0開始,則(nSel+1)對應的才是實際串口號)
m_ctrlComm.put_PortOpen(TRUE);//打開串口
m_ctrlComm.put_RThreshold(2);//收到2個字節引發OnComm事件
m_ctrlComm.put_InputMode(1);//輸入模式選為二進制
m_ctrlComm.put_Settings(_T("115200,n,8,1"));//設置串口參數
m_ctrlComm.put_RThreshold(1);//參數1表示每當串口接收緩沖區中有多于或等于1個字符時將引發OnComm事件
m_ctrlComm.put_InputLen(1024);//設置當前接收區數據長度為0
m_ctrlComm.get_Input();//先預讀緩沖區以清除殘留數據
2.2發送過程
發送過程包括選擇文件和發送數據2個程序。點擊打開文件按鈕,選擇需要發送的文件,對應的消息響應函數為:
CFileDialog fileDlg(true);//創建CFileDialog類的對象,設置為創建打開文件對話框
fileDlg.m_ofn.lpstrFilter=LPCTSTR(_T("TextFiles(*.txt)\0*.txt\0All File(*.*)\0*.*\0\0"));//設置過濾器
fileDlg.m_ofn.lpstrTitle=LPCTSTR(_T("打開文件"));//定義對話框的標題
if(fileDlg.DoModal()==IDOK)//若點擊對話框的確認按鈕
{
m_sendfilePath=fileDlg.GetPathName();//保存所選文件的路徑
}
點擊發送文件按鈕,在串口打開的情況下,按照只讀方式打開文件后,從文件中讀取數據。將文件名及所讀取的數據按照通信協議的格式進行打包,通過串口發送出去。在發送過程中,設置進度條用以顯示發送進度。應用的主要函數如下:
CFile file;//建立文件類對象file
file.Open(m_sendfilePath,CFile::modeRead);//以只讀方式打開文件
file.Read(pBuf,fileLen);按照文件內容大小fileLen將數據讀取到緩沖區pBuf中
2.3接收過程
進行串口配置時,規定當串口接收緩沖區中有多于或等于1個字符時將引發OnComm事件,對應的接收程序流程如圖2所示。
正確讀取文件名及文件內容后,按照所選路徑創建新的文件,默認文件名為收到的文件名,也可修改。將文件內容寫入文件,完成文件保存。在接收過程中,設置進度條用以顯示接收進度。應用的主要函數如下:
CFilesavefile(m_savefilePath,CFile::modeCreate|CFile:: modeWrite); //在所選路徑下調用構造函數創建一個新文件,打開文件并寫入數據
savefile.Write(result,strlen(result));//將恢復出的文件內容寫入文件,strlen()表示計算內容大小
savefile.Close();//關閉文件
2.4文件夾和文件顯示
若接收文件的文件名不為空,則表示已經收到文件。點擊“打開所在文件”按鈕,顯示保存接收文件所在的文件夾。點擊“打開文件”按鈕,顯示接收文件。應用的主要函數如下:
ShellExecute(NULL,"open",m_revfolderPath, NULL,NULL, SW_SHOWNORMAL);//打開文件夾,m_revfolderPath表示接收文件所在文件夾路徑
ShellExecute (NULL,"open",m_savefilePath, NULL, NULL, SW_SHOWNORMAL);//打開文件,m_savefilePath表示文件路徑
2.5界面設計與操作流程
2.5.1界面設計
程序界面包括串口設置、發送文件和接收文件,如圖3所示。在進行初始化時,向串口號下拉框中添加數據COM1~COM9,波特率下拉框中添加數據9 600~115 200;發送文件部分用只讀編輯框顯示發送文件路徑,進度條顯示發送進度;接收文件部分用只讀編輯框顯示接收文件路徑,進度條顯示接收進度。
2.5.2操作流程
①通信雙方在通信前應設置相同的串口波特率,P900無線串口通信模塊的空中信息傳輸速率為115 200 bps,因此設置串口波特率都為此值,串口號依據各自通信模塊占用的端口號為準,該號可在設備管理器的端口選項中進行查詢。點擊“打開串口”按鈕,串口被打開,串口號和波特率2個組合框變為只讀,按鈕上的文本顯示為“關閉串口”,若再點擊該按鈕,則串口關閉,串口號和波特率2個組合框變為可編輯,按鈕上的文本顯示為“打開串口”。
②點擊“打開文件”按鈕,選擇要發送的文件,彈出發送文件對話框,點擊確定,則打開文件,文件名顯示框中顯示將要發送文件的路徑。點擊“發送文件”按鈕,若串口處于關閉狀態,則彈出警告窗口,若串口處于打開狀態,則發送該文件,進度條顯示發送進度,當發送完成時,彈出發送完成提示。
③接收端接收到文件后,彈出是否接收的提示窗口,若取消,則不接收;若同意,則表示接收文件,彈出保存文件對話框,點擊保存,則保存該文件。進度條顯示接收進度,接收完成后,彈出文件已保存提示。
④點擊“打開所在文件夾”按鈕,彈出文件所在文件夾;點擊“打開文件”按鈕,顯示文件。
3結束語
利用配置P900無線串口通信模塊的計算機作為無線串口數據收發終端,避免了有線連接的局限性。在Visual C++2010環境下,進行軟件設計與編程,用MSComm串口通信控件解決該版本難以直接進行串口通信的問題。通信協議靈活且簡單易懂。試驗結果表明,該設計采用可實現穩定可靠的遠距離文件傳輸,取得了良好的應用效果。
參考文獻
[1]王保印,康健,姜傳國.用VC++6.0中MSComm控件實現多類型文件傳送[J].吉林大學學報(信息科學版),2004(2): 164-168.
[2]鄔金松,李廣彪.PC機和單片機之間文件傳輸[J].艦船電子工程,2005(4):83-85.
[3]戴楠,孫長國,劉志宏.基于CC1110的無線串口通信系統設計與實現[J].計算機與網絡,2010,36(21):68-70.
[4]王正強.VC中應用MSComm控件實現串口通信[J].電子測試,2010(5):73-76.
[5]趙邦信.利用通信控件進行串口文件傳送時的可視化程序設計[J].現代電子技術,2001(7) :18-21.
[6]王春媚.多串口并行通信數據傳輸系統設計[J].現代電子技術,2017(4) :86-90.