2021-4-9 | 通信技術
0引言
遠程通訊系統一般要求通信距離在30公里以上,所以通常情況下通信環境比較復雜,在較長距離下的電磁干擾和信號衰弱對通訊系統的穩定性都提出了較高的要求。串口是常用的計算機與外部設備之間的數據傳輸通道[1],由于使用其通信方便易行,且能實現數據的遠距離傳輸,故可采用串口通信作為遠程通信的渠道。同時要利用合理的通信幀定義模式進而實現遠程通信協議的同步性問題,目前較為常用的方法有逐次比較法[2]、基于FIFO隊列同步法[3]、狀態機消息同步法[4]。實驗表明狀態機消息同步法最大限度地減少了系統的冗余運算和中斷后數據丟失的問題,保證了控制站第一時間獲得被控設備是否接受指令開始運行的信息,實現了控制的可視性,進而保證了系統的穩定運行。
1通訊設備配置
系統采用串口通訊的方式實現PC機與外部設備的連接,利用VC++編寫的控制軟件和指令接收軟件實現系統指令的發送和執行。外部設備采用PDL35數傳電臺,這種電臺能夠實現最大19200比特每秒的傳輸速度,并且具有低功耗和前向糾錯的能力,提高了抗干擾性和覆蓋性。控制設備通過電臺向工作設備發送標準化指令,雙方基于特定頻率的無線電互相訪問。連接成功后進入設置主界面后可查看電臺類型、頻率范圍、固定版號等信息。主要在”RadioLink”選項卡下設置通訊頻率、波特率與通信靈敏度。特別需要注意的是通信頻率和通信靈敏度需要基站和移動站完全一致。
2通訊幀格式定義
對于遠程通訊系統,需要完成多個不同的工作,并且實時返回工作狀態以保證遠程控制的可靠性。這就需要對通信協議進行特殊的定義以進行解析同步,進而完成各項工作。本系統中定義通信協議幀結構如圖2所示。幀頭用于同步[5],一般為一個或兩個ASCII字符,本系統中使用一個字節0xFF表示,系統接收此字符后開始接收中斷。幀發送方用1字節表示,分別用0x01表示1號基站發送的命令,同時也意味著任何接收設備會向此基站反饋設備是否正常運行。幀接收方表示方法與發送方相同,0x01表示命令是發送給1號設備的,其他設備在接受此命令時不工作。幀類型定義了系統命令表征的不同功能,幀內容主要包含了指導接收設備如何執行功能的具體信息,而幀內容長度則作為幀內容的校驗信息指導接收設備提取接收信息。在本系統采用一個字節的0xFE作為結束碼,當系統檢測到此數據段的時候跳出系統中斷。表1為通信協議中幀內容的詳細格式。
3串口通信數據解析及處理
3.1逐次比較法
這是一種比較基本的方法,首先等待串口數據,在串口接收中斷服務程序中每收到一個數據就與已知的命令數據串進行比較[6],如果不一致則等待新數據直到接收的數據與包頭信息的第1個數據相同。第1個字節的數據比較正確后將收到的第2個字節與已知數據串信息的第2個字節進行比較,如果不正確則退出此中斷。程序流程如圖3所示。此種方法代碼量小、編程簡單,可用于在主程序中數據量較小并且格式相對固定的程序。但是這種方法浪費了大量的中斷進程,并且在每個中斷過程中執行命令操作需要消耗較多的機器周期,無法滿足串口數據量較大且傳輸較快的情況。
3.2基于數組的FIFO隊列法
也有人提出對上述方法的改進,首先定義一個固定長度的全局數組,并將數組看做是一個先入先出的FIFO隊列[8]。在串口接收中斷中,每接收一個數據就保存在此數組中,將得到的數據與已知的命令格式串進行比較,如果正確則將數組中的所有數據向前移動一個字節,串口接收到的新字節存入數組末字節中,將整個數組與協議中的包頭信息比較如果正確則置位已同步標志位然后開始接收存儲有用數據[8],否則繼續等待同步。其流程圖如圖4所示。此種方法與逐次比較的幀同步方法相比能夠比較快速正確地檢測出同步包頭,但是對數據格式要求相對固定,特別是幀內容形式比較復雜的時候難以對數組的長度進行限制,在提取相關的信息的時候會浪費大量的時間。
3.3基于字符串的狀態機消息相應機制
鑒于以上兩種方法的缺點,在本系統中采用基于字符串的狀態消息響應機制,首先將命令轉化為字符串的格式,以十六機制代碼發送給電臺進行傳輸。在接收方,首先檢測同步字符,當檢測到同步字符時,響應狀態機消息機制,同時將此字符串依次存入緩存中。由于傳輸距離比較遠,一般存在字符串命令不能在一個機器周期內到達的情況,則指定系統一直處于寫緩存狀態中。當第一個機器周期沒有檢測到結束碼,則將緩存內容寫給一個過渡變量,同時清空緩存以完成下一步寫緩存操作。依次進行以上操作,在每一次機器周期結束后將緩存中的數據累加到過渡變量中,直到系統檢測到接收數據的最后一個字節變量為結束碼,此時將緩存中的變量賦值給消息效應命令,開始狀態機響應環節。狀態機狀態轉移圖如圖5所示。當
數據完成初始檢測校驗,即檢測到結束碼0xFE之后,系統開始狀態消息響應循環,否則超過一定時間沒有結束校驗,則默認此次命令消息發送失敗,系統緩存清空,跳出串口中斷。在消息響應循環中,系統會根據預先設定的字符串格式和所檢測到的字符串標志位信息,對接收到的有效數據進行提取,并賦值給相應的變量做下一步的操作。指令操作結束后,工作設備將自動返回“命令接受正確”指令,向基站確認此次操作成功。否則任何一步出現錯誤,系統將自動跳出中斷,并返回“命令格式錯誤”指令,提示基站重新發送命令。工作設備示例程序段如下:BYTEdata[1024];CStringstr;if(m_MSComm1.GetCommEvent()==2){m_input1=m_MSComm1.GetInput(;m_input2=m_input1;length=m_input2.GetOneDimSize();for(i=0;i<length;i++){m_input2.GetElement(&i,data+i);}m_receivedata.Empty();for(i=0;i<length;i++){chara=*(char*)(data+i);str.Format("%c",a);m_receivedata+=str;//串口消息獲得}guodu+=m_receivedata;guodujieshu=m_receivedata.Mid(length-2,2);if(guodujieshu=="FE"){receivefasongfang=m_receivedata.Mid(2,1);receivejieshu=guodu.Mid(guodu.GetLength()-2,2);}}////////////////////數據接收本系統的設計思路由于采用了基于字符串的狀態機消息響應機制,快速有效地實現了串口通信的同步,而且程序結構清晰、便于維護、也方便日后通訊系統功能升級。并且串口中斷服務子程序中將有效數據提取為不同的字符串變量,方便操作的同時也減少了完成消息響應循環所需要的周期。