,,
(中北大學 信息探測與處理技術重點實驗室,太原 030051)
目前,國外大多數采用GPS通信相對比北斗通信精度更加準確,為了能夠提高北斗的大大推廣與使用,北斗短報文通信在國內展開一系列的應用。北斗在國內的優(yōu)勢主要體現在方方面面。例如,北斗短報文通信在生活中,軍用方面等起著不可替代的作用。通信抄表中,海上船員健康監(jiān)測中,泥石流監(jiān)測系統(tǒng)中。[1]根據北斗短報文的廣泛應用,分析北斗短報文通信的基本性能,設計了基于Labwindows/CVI的上位機北斗短報文通信軟件,軟件與系統(tǒng)硬件的傳輸由Visual C++開發(fā)的串口通信調用RS232接口驅動程序完成。進行完成北斗短報文的通信,能夠完成自檢信息和IC地址的檢測,根據用戶的操作可以每間隔60秒進行一次接收與發(fā)送通信。最終通過測試順利完成了基于Labwindows/CVI的上位機北斗短報文通信。
北斗短報文主要由上位機軟件和北斗信通BDSC-01型數傳一體機硬件部分組成。上位機軟件主要采用模塊化設計,首先利用主函數,串口通信等框架把上位機主要實現的功能和程序的基本實現過程進行搭建,并定義好各個模塊之間的通信關系,得到以各個模塊為單位的算法實現,針對各個模塊進行開發(fā),通過串口將不同的功能模塊聯系在一起。
上位機的軟件開發(fā)在架構上有7個功能模塊:參數初始化模塊,串口通信模塊,系統(tǒng)自檢模塊,定時接收模塊,定時發(fā)送模塊,清空信息模塊,生成報表模塊,數據顯示模塊。如圖1所示。
圖1 上位機軟件模塊組成結構圖
參數初始化模塊將串口通信的COM口清零置位操作,以便串口通信模塊的順利進行,系統(tǒng)自檢模塊通過與硬件天線相結合等待自檢完成,獲取天線上的IC地址。串口通信連接完成,自檢結束用戶可以開始進行消息的定時發(fā)送和傳輸,位置的獲取,將接收到的消息,以及位置信息生成報表保存到Word文檔中進行保存。最終各個模塊的信息測試得到的數據都將顯示在Labwindows/CVI界面上,在上面運行上位機界面時將看不到定時器的相關信息,會出現在界面上兩個倒計時的數字,以便用戶能夠準確的進行信息的發(fā)送。
上位機軟件和北斗天線通過RS232串口總線進行連接,總線串口軟件使用編寫的串口通信函數動態(tài)庫與RS232通信,并進行波特率,數據位,校驗位,停止位的配置[2]。配置完成打開串口,進行系統(tǒng)自檢,判斷是否進行進行到系統(tǒng)自檢,當判斷是否進行自檢時,進行了一步步判斷依次進行當上位機首先檢測到不是系統(tǒng)自檢時,進行下一步判斷是否進行通信申請當進行通信申請正常時,依次進行下一步的自檢信息,當自檢信息依次上面流程完成時,便可進入正常的信息的發(fā)送與接收。獲取北斗天線的IC地址值,地址值獲取完成即可進行地址的獲取以及信息的發(fā)送與接收,不管發(fā)送數據還是進行接收數據都是識別人機界面發(fā)生的事件,從而響應用戶的操作,進行各種指令的后臺準備,可以對每次發(fā)送消息的字符限制進行測試。并將獲取來的地址進行加以分析。北斗短報文的上位機可以為消息的獲取,以及地理位置的準確定位,同時進行時間上的間隔以免消息發(fā)生漏傳,漏發(fā)[3]。經過總體的把握和具體實際開發(fā),最后形成的人機交互界面如圖2所示。
圖2是上位機主界面,在進行上位機的自檢之前,應當先進行串口通信,確保在通信之前所有的串口進行初始化配置。
北斗短報文的硬件部分基于BDSC-01型數傳一體機,針對北斗電力抄表、水利雨量監(jiān)測、海洋浮標數據傳輸設計的一款支持北斗RDSS、RNSS以及GPS的多功能北斗通信終端??蓪崿FRDSS的雙向定位、短報文通信、位置報告以及RNSS的定位和授時功能。終端采用一體化設計,固定桿安裝更為方便,配備串口,便于用戶進行二次開發(fā)。終端體積小、功耗低,連接簡單、操作方便,可廣泛應用于電力、水利、海洋等行業(yè)。
全天候的雙向短報文通信和導航定位功能;支持BDS/GPS雙模工作,保證導航定位更加穩(wěn)定;集成化程度高,RDSS模塊、RNSS模塊及天線融于一體;采用防水設計IP67,可在室外可靠工作。相對于北斗短報文的通信模塊用戶通過發(fā)送通信指令,實現短報文通信功能;短報文通信需要對衛(wèi)星發(fā)射信號并占用服務頻度;短報文最大字節(jié)數由用戶卡所決定;單次發(fā)送的電文字節(jié)數不能超過用戶卡所規(guī)定的字節(jié)數,否則多余的字節(jié)數將會被丟棄。采用插卡模式用戶機要正常使用,必須插入北斗專用的SIM卡。
SIM卡主要參數,卡號:用戶卡的唯一識別號碼;入站頻度:用戶機在兩次發(fā)送的最小時間間隔,單位秒;最大發(fā)送電文BIT數:用戶機能夠一次發(fā)送的最大信息 BIT數。北斗 雙向定位 用戶通過發(fā)送定位指令,實現雙向定位功能;雙向定位需要對衛(wèi)星發(fā)射信號并占用服務頻度; 衛(wèi)星收到請求指令后,會反饋給用戶機當前所在位置的經度、緯度和高程;這部分主要是作為北斗短報文上位機的輔助部分,作為參考使用。
北斗短報文的硬件使用時應該注意用戶機底座裝有安裝支架,可以用喉箍將裝好安裝支架的用戶機牢牢地綁定到固定物上;請確保用戶機圓形天線端朝上,并安裝牢固; 確認是否有東西會遮擋用戶機,如果用戶機被遮擋請及時清理,否則將使用戶機性能變差或失效。用戶機未連接電纜時,必須給電源接口裝上密封套。如圖3所示。
圖2 上位機主界面 圖3 北斗短報文硬件組成
基于Labwindows/CVI的串口通信在基于北斗短報文的通信平臺中提供了極大方便。在上圖2中打開串口,進行串口初始化,設置串口通信。包括端口參數串口號,波特率,數據位,停止位,奇偶校驗位等參數設置。[4-5]在Labwindows/CVI中的RS232函數庫中提供了串口通信的控制函數:打開和關閉函數;串口的讀寫函數;串口設置函數以及回調函數。其中部分被用到打開關閉函數如下:OpenCom(打開串口),OpenComConfig(打開串口同時設置通訊參數),CloseCom(關閉串口);串口的讀寫函數如下:ComRd(從串口讀一個字符串),ComWrt(從串口寫一個字符串);串口設置函數如下:SetCTSMode(設置硬件握手),FlushInQ(清空接收隊列)[6-7],FlushOutQ(清空接收隊列);SetXMode(允許或禁止串口通信的軟件握手)。
使用基于Labwindows/CVI開發(fā)環(huán)境串口通信程序不僅僅降低了開發(fā)效率,同時大大縮短了測試時間,提高了可靠性并且具有很高的通用性。相對于其它上位機軟件的編寫而言再該程序軟件中主要圖形界面應用簡單大方得體,使得開發(fā)者很容易進行程序的上手,便于參考著的使用。良好的用戶界面(GUI)強大庫函數和便捷的調試手段,能夠更好更優(yōu)的開發(fā)。部分串口通信代碼如下:
GetCtrlVal(panelHandle,PANEL_COM_B, &portNumber); //串口號
if(portNumber>0)
{
GetCtrlVal(panelHandle, PANEL_OPEN_COM_B, &getFlag);
if(getFlag == 1)
{
GetCtrlVal(panelHandle, PANEL_BAUDRATE_B, &baudRate) //波特率
GetCtrlVal(panelHandle, PANEL_PARITY_B, &parity); //校驗位
GetCtrlVal(panelHandle, PANEL_DATABITS_B, &dataBits); //數據位
GetCtrlVal(panelHandle,PANEL_STOPBITS_B, &stopBits); //停止位
sprintf(deviceName,"COM%d",portNumber)
COM_B = portNumber;
ret=OpenComConfig(portNumber,deviceName, baudRate, parity, dataBits, stopBits, 512, 512);
if(ret < 0) MessagePopup("RS232錯誤","配置串口B失??!");
SetComTime (portNumber, 5);
InitCOM_B(1);
SetCtrlAttribute(panelHandle, PANEL_SELFTEST_B, ATTR_DIMMED, 0);
}
else if(getFlag == 0)
{
SetCtrlVal(panelHandle, PANEL_XTZJ_LED_B, 0);
Sleep(500);
CloseCom (portNumber);
InitCOM_B(0);
SetCtrlAttribute(panelHandle,PANEL_SELFTEST_B, ATTR_DIMMED, 1);
SetCtrlAttribute(panelHandle, PANEL_SEND_B, ATTR_DIMMED, 1);
}
}
通過串口精靈監(jiān)視得到的數據根據北斗通信協(xié)議加以分析。打開串口后進行上位機的XTZJ(系統(tǒng)自檢),ICJC(IC檢測),TXSQ(通信申請),ZJXX(自檢信息)依次進行完之后獲取得到自檢成功同時獲得IC地址,監(jiān)視數據如圖4。
圖4 串口監(jiān)視數據
根據串口精靈監(jiān)視得到的數據,對應北斗協(xié)義2.0分析得出IC檢測:24 49 43 58 58 00 16 04 81 1C 00 1D 81 DD 06 00 3C 03 00 00 00 D9其中24 49 43 58 58 代表IC檢測,中間部分代表幀號,04 81 1C代表用戶機的IC地址295196,04 B3 E1代表320433,兩個用戶機分別是在該實驗中進行試驗得到的數據,00 D9代表校驗位發(fā)送中北大學回顯與北斗一號的用戶級數據接口協(xié)議相符顯示十六進制如下:24 46 4B 58 58 00 10 04 81 1C 04 00 00 00 3C 98。進行多次試驗進行一次發(fā)送漢字,英文字母,數字等按照北斗通信協(xié)議一一對應多次進行研究查閱相應的編碼表得出相應的編碼規(guī)范能夠應用于廣泛的通信中,得到對應十六進制的解析。其中在通信中涉及到了一些進制的轉化,比如ASCII與十六進制的轉化進行相關計算最終得出相應的準確信息。如下表1,表2依次表示用戶機接口協(xié)義。
表1 用戶機,信息檢測接口協(xié)議
表2 用戶機協(xié)議
在實驗中點擊自檢,等待自檢完成時獲取IC地址分別獲取兩個用戶機的的地址分別為295196和320433如圖5~6所示。
圖5 用戶機IC地址獲取 圖6 用戶機IC地址獲取
上位機軟件在設置定時的過程中涉及多線程以及線程池問題,當接收信息和發(fā)送信息時遇到多任務的處理情況,比如在進行客戶端A向客戶端B發(fā)送消息時,同時客戶端B向客戶端A發(fā)送數據時可以并行進行。若采用單線程變成方法,需要等待一方數據傳輸完時才能進行另一方的信息傳輸,大大的降低了程序的執(zhí)行效率,系統(tǒng)的實時性也難以得到保證。[8]而多線程程序是在同一段時間內進行至少有兩個獨自的線程在執(zhí)行代碼,其中每一個線程都有自己的堆棧情況進行獨自的分配,并且能夠進行獨立的運行在其他程序的線程中,即能進行各種保證線程運行的實時性,又能夠響應客戶的其它操作,能夠在最大限度上地提高系統(tǒng)的運行速度以及程序的響應速度。[9]
北斗短報文上位機設計主要在定時中涉及到了多線程池問題,應用于客戶端操作的CmtThreadPoolHandle poolHandle線程池操作,具有最高的優(yōu)先級,保證了客戶端A和客戶端B在同時進行消息發(fā)送時及時的響應處理。這樣就不用擔心信息在傳輸過程中的丟失。
在Labwindows/CVI給用戶提供了兩種線程機制:線程池和異步定時器。線程池就像一個線程容器,里面放的就是運行中的線程數據起著保存數據分析數據的作用,采用函數CmtScheeduleThreadPoolFunction啟動一個新線程,定時線程在線程池中開辟。異步定時器是一種在程序中適時生成的定時器,在一定時間內反復執(zhí)行代碼實現功能,生成異步定時器的函數可以是NewAsyncTimer,在函數中配置其間隔時間,事件發(fā)生次數以及事件的響應函數,信息顯示線程通過異步定時器實現。[10]使用多線程機制后,信息的讀取無丟失,處理以及分析的時間充足,大大提高了程序的執(zhí)行能力。
上位機軟件中進行定時接收和定時發(fā)送中,使用到定時器間隔一定的時間間隔來觸發(fā)事件。由定時器控制這些事件進行的速度,用戶只能在界面上看到該控件,但是在程序的運行過程中是不可見的。正是因為如此,在上位機程序的運行過程中,用過操作時不能使用鼠標或是鍵盤去進行操控。定時器會按照用戶設定好的時間間隔,產生EVENT_TIMER_TICK事件,隨后會執(zhí)行相應的回調函數。其中里面涉及到定時器的兩個重要屬性分別為:ATTR_ENABLED為定時器是否可以進行相應控件的回調函數;ATTR_INTERVAL為設置定時器執(zhí)行回調函數的時間間隔。[11-12]]其中部分代碼如下:
CopyBytes (len, 0, RecvBuf_B, 4, 2);
ComRd(COM_B,RecvBuf_B,HexConvertDecimal(len,2)-7);
CopyBytes(temp,7,RecvBuf_B,0,HexConvertDecimal(len,2)-7);
if(CheckSum(temp,HexConvertDecimal(len,2)-1) != temp[HexConvertDecimal(len,2)-1])
{
TimerRecvB = WAIT_RECV_B;
return 0;
}
CopyBytes (ADD_B, 0, RecvBuf_B, 0, 3);
sprintf(addStr,"%ld",HexConvertDecimal(ADD_B,3));
SetCtrlVal(panelHandle, PANEL_IC_ADD_B, addStr);
SetCtrlAttribute(panelHandle,PANEL_SEND_B, ATTR_DIMMED, 0);
TimerRecvB = WAIT_RECV_B;
break;
case 0x0d: //FKXX
//InsertTextBoxLine(panelHandle, PANEL_RECEIVEBOX_B, -1, "FKXX");
break;
case 0x0c: //TXXX
CopyBytes (len, 0, RecvBuf_B, 4, 2);
ComRd(COM_B,RecvBuf_B,HexConvertDecimal(len,2)-7);
CopyBytes (temp, 7, RecvBuf_B, 0, HexConvertDecimal(len,2)-7);
if(CheckSum(temp,HexConvertDecimal(len,2)-1) != temp[HexConvertDecimal(len,2)-1])
{//TimerRecvB = WAIT_RECV_B;
return 0;
CopyBytes (len, 0, RecvBuf_B, 9, 2);
CopyBytes (temp, 0, RecvBuf_B, 12, HexConvertDecimal(len,2));
sprintf(disStr,"%s",temp);
InsertTextBoxLine(panelHandle,PANEL_RECEIVEBOX_B, -1, disStr);
TimerRecvB = WAIT_RECV_B;
break;
}
}
打開軟件客戶端A串口與客戶端B串口,根據電腦系統(tǒng)檢測到的串口選擇好串口號,波特率,校驗位,數據位以及停止位,初始準備工作已完成,進行系統(tǒng)自檢指示框變成綠色表示已經自檢成功,點擊系統(tǒng)自檢獲取IC地址如圖所示的客戶端A與客戶端B的地址,此時表明可以進行正??蛻舳薃與客戶端B的通信,每隔60秒定時由客戶端A向客戶端B發(fā)送數據成功顯示在客戶端B上,同時也測試客戶端B向客戶端A發(fā)送數據客戶端A成功顯示,如下圖7所示。
圖7 實驗測試結果
通過介紹北斗短報文通信的上位機軟件設計與實現。設計主要采用以模塊化為思路,貫穿整個上位機的設計過程,將系統(tǒng)的所有功能按照模塊加以劃分,使得程序的結構清晰明了,便于測試,大大的提高了編程效率,增強了軟件的可維護性與可擴展性。軟件開發(fā)過程中使用線程池技術以及定時器技術,得以使信息正確地進行傳輸;根據北斗通信協(xié)議的正確解析與分析使得通信的正常運行;串口通信技術,實現了軟件與硬件的連接,順利完成了多次測試任務,性能穩(wěn)定,界面簡單大方,操作簡單,堅實的消息的正常傳輸更簡單化,智能化。