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