日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

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

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

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

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

  數(shù)據類型、數(shù)據長度和數(shù)據塊是主要的數(shù)據部分。數(shù)據類型可以標識后面緊接著的是命令還是數(shù)據。數(shù)據長度用于指示有效數(shù)據的個數(shù)。

  校驗碼則用來檢驗數(shù)據的完整性和正確性。通常對數(shù)據類型、數(shù)據長度和數(shù)據塊三個部分進行相關的運算得到。最簡單的做法可是對數(shù)據段作累加和,復雜的也可以對數(shù)據進行CRC運算等等,可以根據運算速度、容錯度等要求來選取。

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

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

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

  void SendByte(unsigned char ch)

  {

  SBUF = ch;

  while(TI == 0);

  TI = 0;

  }

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

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

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

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

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

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

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

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

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

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

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

  0x45,從目的地址開始結算累加、異或校驗和,到數(shù)據的最后一位結束。

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

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

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

  else if(state_machine == 1){

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

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

  else if(state_machine == 2){

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

  state_machine = 0; // 狀態(tài)機復位

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

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

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

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

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

  CSerialPort向父類發(fā)送的消息號如下:

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

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

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

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

  int retval = 0;

  rcvdat = (BYTE)ch;

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

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

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

  else if(state_machine == 1) {

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

  state_machine = 0; // 狀態(tài)機復位 。。。。。.5.總結

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

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉