日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

上下位机通讯协议_嵌入式中自定义协议的一些典型例子

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 上下位机通讯协议_嵌入式中自定义协议的一些典型例子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


關于自定義協議,對于會的人很簡單,對于不會的人就摸不著頭腦。下面分享一些關于自定義協議的筆記。

什么是協議?

協議這個概念我覺得挺雜的。就像嵌入式的概念一樣,說法不一,比如大家常常爭論FPGA是不是嵌入式、單片機是不是屬于嵌入式等等。下面簡單看一下嵌入式中協議這個概念。

在互聯網領域,協議常常指的是網絡協議。

在嵌入式中,協議按大類分主要可分為底層協議(硬件層協議/物理層協議)與上層協議(用戶層協議應用層協議),根據實際還可細分成很多層。底層協議如串口等,底層協議決定著數據傳輸的方式(傳輸數據需要多少條信號線,傳輸數據的時序是怎樣的)。上層協議決定著這些數據是拿來干什么用的。太難解釋了。。看實例吧:

這是多功能電能表的協議通訊協議,其中底層協議是485通訊,上層協議有很多條,但格式基本都統一:

每一幀(包)數據的格式都類似是這樣子的格式,例如讀數據協議:

主站往從站發送數據(控制器->智能電表):

從站往主站發送數據(智能電表->控制器):

明確了協議之后,該發什么數據、收到的數據是怎么樣我們都心里有數,那么這個通信的過程就很明朗了。一般控制器往外發送協議數據都比較簡單,重點是返回數據的處理(解析),解析方式根據協議的不同而有不同的方法。

協議(上層協議)按照通用性來分可以分為專有協議與自定義協議,例如上面電表的協議其實是專有協議(具有一些標準的協議):

自定義協議就是我們開發者可以針對一些應用、一些需求自己制定的一些協議。下面來分享一些常見的自定義協議:

常見的自定義協議

在我們嵌入式開發中,自定義協議的應用很多。例如上下位機之間的通訊、控制器與控制器之間的通訊、服務器與設備終端之間的通訊等。自定義協議也沒有什么特定的規范、標準,可以很靈活地制定,只要能滿足開發需要即可。下面依舊以實例來做分享:

例子一(典型):

之前有個物聯網項目,服務器往我們終端設備發送的協議數據類似于:

我們設備終端需要用到協議數據中字段的實際數據,整個數據包是字符串的形式,這時候可以用sscanf函數來做解析:

關于sscanf函數就不做解釋了,不會的朋友自行百度。sscanf函數在做類似的解析非常好用,很多時候都可以使用。如:

因為是兩端通訊,當然要確保通訊的正確性。比如服務器往設備發送數據,怎么知道有沒有發送,這就得設備端在收到數據的同時回應相應的數據包。可以使用與sscanf函數相對應的sprintf函數做組包操作。比如(這個sprintf例子與上例無關,只是為了說明一下sprintf的用法):

一端給另一端發送數據一般有兩種,以設備端在往服務端發送數據為例:

(1)當設備收到服務端的數據時,會回應與之對應的數據,這稱為被動應答。

(2)設備主動給服務端發送數據,例如設備常常定時、主動地給服務端發送一些時間戳信息等(俗稱心跳包),這樣服務端就知道設備是在正常工作的(活著的狀態)。這稱為主動發送或主動申請。

在處理這些字符串形式的協議數據的時候用sscanf、sprintf、strcmp、strstr、strcat等函數非常方便,有時候可以搭配正則表達式來做匹配。

例子二(典型):

之前有個項目需要從控制板顯示主控制板的運行狀態,兩控制板之間使用的底層協議為485協議。上層協議(從控板接收數據協議)如:

這里省略的部分為其他信息,比如整個數據包的長度等。

解析函數如:

這里的應用比較簡單,只是解析一個報警信息來顯示。有時候需要用到整個數據包里的數據,這時候我們可以建立一個結構體來保存所有我們需要的數據,這樣方便我們清晰、有條理地對數據進行處理。例如:

例子三(其它):

上面的兩個例子中的自定義協議是比較典型的、用得比較多的。下面也分享其它我自己的一些例子,很多時候為了滿足我們自己通訊應用的需要,我們也會自己建立一些自己的小協議來滿足我們的需求。

(1)例子一

之前使用串口屏與STM32通訊的時候,我們有制定一些對應的協議。

為了讓STM32能識別我串口屏不同頁面發送的數據,必須要制定一條協議來識別頁面:

這樣,每切換至不同的頁面時,就會往STM32發送關于頁面的協議數據,這樣我們就可以知道當前處于哪個界面。

為了讓STM32能接收到正確的WiFi設置信息(如何區分WiFi名與密碼),必須要給WiFi信息添加一些輔助協議數據,如:

相應的解析處理函數:

(2)例子二

之前在一個單相用電器監測的應用中,有用到zigbee無線通訊,即其中一塊控制板做采集板。另一塊控制板做顯示板,有些朋友可能會有疑問為什么不做在同一塊板上?其實這是一道全國大學生電賽題,我們只是根據題目要求來做的:

我們當時在做這個通訊時也是有制定一個簡單的協議,在數據前面加個標識,就像JSON格式數據的鍵值對。

我們制定的協議如:

相應的解析及結果:

類似這樣子的協議解析實際上是有套路的,摸清楚這些套路之后以后在做類似應用的時候其實就很簡單了。重點掌握sscanf、sprintf、strcmp、strstr、strcat等函數以及上面的兩種典型例子。小編在三個地方搬過磚,每個地方都有用到類似的自定義協議,而且都形成專門的協議文檔,每次做類似通訊類的應用的時候,都會按照這樣已份協議文檔來修改以適應不同的項目。

以上就是本次分享的關于嵌入式中自定義協議的一些筆記,希望各位看官喜歡。如有錯誤,歡迎指出,謝謝!

總結

以上是生活随笔為你收集整理的上下位机通讯协议_嵌入式中自定义协议的一些典型例子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。