當(dāng)前位置:首頁(yè) > 物聯(lián)網(wǎng) > 網(wǎng)絡(luò)協(xié)議
[導(dǎo)讀]   現(xiàn)在大部分的儀器設(shè)備都要求能過(guò)通過(guò)上位機(jī)軟件來(lái)操作,這樣方便調(diào)試,利于操作。其中就涉及到通信的過(guò)程。在實(shí)際制作的幾個(gè)設(shè)備中,筆者總結(jié)出了通信程序的通用寫(xiě)法,包括上位機(jī)端和下位機(jī)端等。

  現(xiàn)在大部分的儀器設(shè)備都要求能過(guò)通過(guò)上位機(jī)軟件來(lái)操作,這樣方便調(diào)試,利于操作。其中就涉及到通信的過(guò)程。在實(shí)際制作的幾個(gè)設(shè)備中,筆者總結(jié)出了通信程序的通用寫(xiě)法,包括上位機(jī)端和下位機(jī)端等。

  1.自定義數(shù)據(jù)通信協(xié)議

  這里所說(shuō)的數(shù)據(jù)協(xié)議是建立在物理層之上的通信數(shù)據(jù)包格式。所謂通信的物理層就是指我們通常所用到的RS232、RS485、紅外、光纖、無(wú)線等等通信方式。在這個(gè)層面上,底層軟件提供兩個(gè)基本的操作函數(shù):發(fā)送一個(gè)字節(jié)數(shù)據(jù)、接收一個(gè)字節(jié)數(shù)據(jù)。所有的數(shù)據(jù)協(xié)議全部建立在這兩個(gè)操作方法之上。

  通信中的數(shù)據(jù)往往以數(shù)據(jù)包的形式進(jìn)行傳送的,我們把這樣的一個(gè)數(shù)據(jù)包稱(chēng)作為一幀數(shù)據(jù)。類(lèi)似于網(wǎng)絡(luò)通信中的TCPIP協(xié)議一般,比較可靠的通信協(xié)議往往包含有以下幾個(gè)組成部分:幀頭、地址信息、數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)塊、校驗(yàn)碼、幀尾。

  幀頭和幀尾用于數(shù)據(jù)包完整性的判別,通常選擇一定長(zhǎng)度的固定字節(jié)組成,要求是在整個(gè)數(shù)據(jù)鏈中判別數(shù)據(jù)包的誤碼率越低越好。減小固定字節(jié)數(shù)據(jù)的匹配機(jī)會(huì),也就是說(shuō)使幀頭和幀尾的特征字節(jié)在整個(gè)數(shù)據(jù)鏈中能夠匹配的機(jī)會(huì)最小。通常有兩種做法,一、減小特征字節(jié)的匹配幾率。二、增加特征字節(jié)的長(zhǎng)度。通常選取第一種方法的情況是整個(gè)數(shù)據(jù)鏈路中的數(shù)據(jù)不具有隨即性,數(shù)據(jù)可預(yù)測(cè),可以通過(guò)人為選擇幀頭和幀尾的特征字來(lái)避開(kāi),從而減小特征字節(jié)的匹配幾率。使用第二種方法的情況更加通用,適合于數(shù)據(jù)隨即的場(chǎng)合。通過(guò)增加特征字節(jié)的長(zhǎng)度減小匹配幾率,雖然不能夠完全的避免匹配的情況,但可以使匹配幾率大大減小,如果碰到匹配的情況也可以由校驗(yàn)碼來(lái)進(jìn)行檢測(cè),因此這種情況在絕大多說(shuō)情況下比較可靠。

  地址信息主要用于多機(jī)通信中,通過(guò)地址信息的不同來(lái)識(shí)別不同的通信終端。在一對(duì)多的通信系統(tǒng)中,可以只包含目的地址信息。同時(shí)包含源地址和目的地址則適用于多對(duì)多的通信系統(tǒng)。

  數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)塊是主要的數(shù)據(jù)部分。數(shù)據(jù)類(lèi)型可以標(biāo)識(shí)后面緊接著的是命令還是數(shù)據(jù)。數(shù)據(jù)長(zhǎng)度用于指示有效數(shù)據(jù)的個(gè)數(shù)。

  校驗(yàn)碼則用來(lái)檢驗(yàn)數(shù)據(jù)的完整性和正確性。通常對(duì)數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)塊三個(gè)部分進(jìn)行相關(guān)的運(yùn)算得到。最簡(jiǎn)單的做法可是對(duì)數(shù)據(jù)段作累加和,復(fù)雜的也可以對(duì)數(shù)據(jù)進(jìn)行CRC運(yùn)算等等,可以根據(jù)運(yùn)算速度、容錯(cuò)度等要求來(lái)選取。

  2.上位機(jī)和下位機(jī)中的數(shù)據(jù)發(fā)送

  物理通信層中提供了兩個(gè)基本的操作函數(shù),發(fā)送一個(gè)字節(jié)數(shù)據(jù)則為數(shù)據(jù)發(fā)送的基礎(chǔ)。數(shù)據(jù)包的發(fā)送即把數(shù)據(jù)包中的左右字節(jié)按照順序一個(gè)一個(gè)的發(fā)送數(shù)據(jù)而已。當(dāng)然發(fā)送的方法也有不同。

  在單片機(jī)系統(tǒng)中,比較常用的方法是直接調(diào)用串口發(fā)送單個(gè)字節(jié)數(shù)據(jù)的函數(shù)。這種方法的缺點(diǎn)是需要處理器在發(fā)送過(guò)程中全程參與,優(yōu)點(diǎn)是所要發(fā)送的數(shù)據(jù)能夠立即的出現(xiàn)在通信線路上,能夠立即被接收端接收到。另外一種方法是采用中斷發(fā)送的方式,所有需要發(fā)送的數(shù)據(jù)被送入一個(gè)緩沖區(qū),利用發(fā)送中斷將緩沖區(qū)中的數(shù)據(jù)發(fā)送出去。這種方法的優(yōu)點(diǎn)是占用處理器資源小,但是可能出現(xiàn)需要發(fā)送的數(shù)據(jù)不能立即被發(fā)送的情況,不過(guò)這種時(shí)延相當(dāng)?shù)男?。?duì)于51系列單片機(jī),比較傾向于采用直接發(fā)送的方式,采用中斷發(fā)送的方式比較占用RAM資源,而且對(duì)比直接發(fā)送來(lái)說(shuō)也沒(méi)有太多的優(yōu)點(diǎn)。以下是51系列單片機(jī)中發(fā)送單個(gè)字節(jié)的函數(shù)。

  void SendByte(unsigned char ch)

  {

  SBUF = ch;

  while(TI == 0);

  TI = 0;

  }

  上位機(jī)中關(guān)于串口通信的方式也有多種,這種方式不是指數(shù)據(jù)有沒(méi)有緩沖的問(wèn)題,而是操作串口的方式不同,因?yàn)镻C上數(shù)據(jù)發(fā)送基本上都會(huì)被緩沖后再發(fā)送。對(duì)于編程來(lái)說(shuō)操作串口有三種方式,一、使用windows系統(tǒng)中自帶的串口通信控件,這種方式使用起來(lái)比較簡(jiǎn)單,需要注意的是接收時(shí)的阻塞處理和線程機(jī)制。二、使用系統(tǒng)的API直接進(jìn)行串口數(shù)據(jù)的讀取,在windows和linux系統(tǒng)中,設(shè)備被虛擬為文件,只需要利用系統(tǒng)提供的API函數(shù)即可進(jìn)行串口數(shù)據(jù)的發(fā)送和讀取。三、使用串口類(lèi)進(jìn)行串口操作。在此只介紹windows環(huán)境下利用串口類(lèi)編程的方式。

  CSerialPort是比較好用的串口類(lèi)。它提供如下的串口操作方法: void WriteToPort(char* string, int len);

  串口初始化成功后,調(diào)用此函數(shù)即可向串口發(fā)送數(shù)據(jù)。為了避免串口緩沖所帶來(lái)的延時(shí),可以開(kāi)啟串口的沖刷機(jī)制。3.下位機(jī)中的數(shù)據(jù)接收和協(xié)議解析

  下位機(jī)接收數(shù)據(jù)也有兩種方式,一、等待接收,處理器一直查詢(xún)串口狀態(tài),來(lái)判斷是否接收到數(shù)據(jù)。二、中斷接收。兩種方法的優(yōu)缺點(diǎn)在此前的一篇關(guān)于串口通信的文章中詳細(xì)討論過(guò)。得出的結(jié)論是采用中斷接收的方法比較好。

  串口初始化成功后,調(diào)用此函數(shù)即可向串口發(fā)送數(shù)據(jù)。為了避免串口緩沖所帶來(lái)的延時(shí),可以開(kāi)啟串口的沖刷機(jī)制。

  3.下位機(jī)中的數(shù)據(jù)接收和協(xié)議解析

  下位機(jī)接收數(shù)據(jù)也有兩種方式,一、等待接收,處理器一直查詢(xún)串口狀態(tài),來(lái)判斷是否接收到數(shù)據(jù)。二、中斷接收。兩種方法的優(yōu)缺點(diǎn)在此前的一篇關(guān)于串口通信的文章中詳細(xì)討論過(guò)。得出的結(jié)論是采用中斷接收的方法比較好。

  數(shù)據(jù)包的解析過(guò)程可以設(shè)置到不同的位置。如果協(xié)議比較簡(jiǎn)單,整個(gè)系統(tǒng)只是處理一些簡(jiǎn)單的命令,那么可以直接把數(shù)據(jù)包的解析過(guò)程放入到中斷處理函數(shù)中,當(dāng)收到正確的數(shù)據(jù)包的時(shí)候,置位相應(yīng)的標(biāo)志,在主程序中再對(duì)命令進(jìn)行處理。如果協(xié)議稍微復(fù)雜,比較好的方式是將接收的數(shù)據(jù)存放于緩沖區(qū)中,主程序讀取數(shù)據(jù)后進(jìn)行解析。也有兩種方式交叉使用的,比如一對(duì)多的系統(tǒng)中,首先在接收中斷中解析“連接”命令,連接命令接收到后主程序進(jìn)入設(shè)置狀態(tài),采用查詢(xún)的方式來(lái)解析其余的協(xié)議。

  以下給出具體的實(shí)例。在這個(gè)系統(tǒng)中,串口的命令非常簡(jiǎn)單。所有的協(xié)議全部在串口中斷中進(jìn)行。數(shù)據(jù)包的格式如下:

  0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D

  其中0x55, 0xAA, 0x7E為數(shù)據(jù)幀的幀頭,0x0D為幀尾,0x12為設(shè)備的目的地址,0xF0為源地址,0x02為數(shù)據(jù)長(zhǎng)度,后面接著兩個(gè)數(shù)據(jù)0x23,

  0x45,從目的地址開(kāi)始結(jié)算累加、異或校驗(yàn)和,到數(shù)據(jù)的最后一位結(jié)束。

  協(xié)議解析的目的,首先判斷數(shù)據(jù)包的完整性,正確性,然后提取數(shù)據(jù)類(lèi)型,數(shù)據(jù)等數(shù)據(jù),存放起來(lái)用于主程序處理。代碼如下:if(state_machine == 0) // 協(xié)議解析狀態(tài)機(jī){

  if(rcvdat == 0x55) // 接收到幀頭第一個(gè)數(shù)據(jù) state_machine = 1; else

  state_machine = 0; // 狀態(tài)機(jī)復(fù)位}

  else if(state_machine == 1){

  if(rcvdat == 0xAA) // 接收到幀頭第二個(gè)數(shù)據(jù) state_machine = 2; else

  state_machine = 0; // 狀態(tài)機(jī)復(fù)位}

  else if(state_machine == 2){

  if(rcvdat == 0x7E) // 接收到幀頭第三個(gè)數(shù)據(jù) state_machine = 3; else

  state_machine = 0; // 狀態(tài)機(jī)復(fù)位

  過(guò)程中,使用了一個(gè)變量state_machine作為協(xié)議狀態(tài)機(jī)的轉(zhuǎn)換狀態(tài),用于確定當(dāng)前字節(jié)處于一幀數(shù)據(jù)中的那個(gè)部位,同時(shí)在接收過(guò)程中自動(dòng)對(duì)接收數(shù)據(jù)進(jìn)行校驗(yàn)和處理,在數(shù)據(jù)包接收完的同時(shí)也進(jìn)行了校驗(yàn)的比較。因此當(dāng)幀尾結(jié)束符接收到的時(shí)候,則表示一幀數(shù)據(jù)已經(jīng)接收完畢,并且通過(guò)了校驗(yàn),關(guān)鍵數(shù)據(jù)也保存到了緩沖去中。主程序即可通過(guò)retval的標(biāo)志位來(lái)進(jìn)行協(xié)議的解析處理。

  接收過(guò)程中,只要哪一步收到的數(shù)據(jù)不是預(yù)期值,則直接將狀態(tài)機(jī)復(fù)位,用于下一幀數(shù)據(jù)的判斷,因此系統(tǒng)出現(xiàn)狀態(tài)死鎖的情況非常少,系統(tǒng)比較穩(wěn)定,如果出現(xiàn)丟失數(shù)據(jù)包的情況也可由上位機(jī)進(jìn)行命令的補(bǔ)發(fā),不過(guò)這種情況筆者還沒(méi)有碰到。

  對(duì)于主程序中進(jìn)行協(xié)議處理的過(guò)程與此類(lèi)似,主程序循環(huán)中不斷的讀取串口緩沖區(qū)的數(shù)據(jù),此數(shù)據(jù)即參與到主循環(huán)中的協(xié)議處理過(guò)程中,代碼與上面所述完全一樣。

  4.上位機(jī)中的數(shù)據(jù)接收和命令處理

  上位機(jī)中數(shù)據(jù)接收的過(guò)程與下位機(jī)可以做到完全一致,不過(guò)針對(duì)不同的串口操作方法有所不同。對(duì)于阻賽式的串口讀函數(shù),例如直接進(jìn)行API操作或者調(diào)用windows的串口通信控件,最好能夠開(kāi)啟一個(gè)線程專(zhuān)門(mén)用于監(jiān)視串口的數(shù)據(jù)接收,每接收到一個(gè)數(shù)據(jù)可以向系統(tǒng)發(fā)送一個(gè)消息。筆者常用的CSerialPort類(lèi)中就是這樣的處理過(guò)程。CSerialPort打開(kāi)串口后開(kāi)啟線程監(jiān)視串口的數(shù)據(jù)接收,將接收的數(shù)據(jù)保存到緩沖區(qū),并向父進(jìn)程發(fā)送接收數(shù)據(jù)的消息,數(shù)據(jù)將隨消息一起發(fā)送到父進(jìn)程。父進(jìn)程中開(kāi)啟此消息的處理函數(shù),從中獲取串口數(shù)據(jù)后就可以把以上的代碼拷貝過(guò)來(lái)使用。

  CSerialPort向父類(lèi)發(fā)送的消息號(hào)如下:

  #define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.

  因此需要手動(dòng)添加此消息的響應(yīng)函數(shù):

  afx_msg LONG OnCommunicaTIon(WPARAM ch, LPARAM port); ON_MESSAGE(WM_COMM_RXCHAR, OnCommunicaTIon) 響應(yīng)函數(shù)的具體代碼如下:

  LONG CWellInfoView::OnCommunication(WPARAM ch, LPARAM port){

  int retval = 0;

  rcvdat = (BYTE)ch;

  if(state_machine == 0) // 協(xié)議解析狀態(tài)機(jī) {

  if(rcvdat == 0x55) // 接收到幀頭第一個(gè)數(shù)據(jù) state_machine = 1; else

  state_machine = 0; // 狀態(tài)機(jī)復(fù)位 }

  else if(state_machine == 1) {

  if(rcvdat == 0xAA) // 接收到幀頭第二個(gè)數(shù)據(jù) state_machine = 2; else

  state_machine = 0; // 狀態(tài)機(jī)復(fù)位 。。。。。.5.總結(jié)

  以上給出的是通信系統(tǒng)運(yùn)作的基本雛形,雖然簡(jiǎn)單,但是可行。實(shí)際的通信系統(tǒng)中協(xié)議比這個(gè)要復(fù)雜,而且涉及到數(shù)據(jù)包響應(yīng)、命令錯(cuò)誤、延時(shí)等等一系列的問(wèn)題,在這樣的一個(gè)基礎(chǔ)上可以克服這些困難并且實(shí)現(xiàn)出較為穩(wěn)定可靠的系統(tǒng)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉