上下位机通讯协议_嵌入式中自定义协议的一些典型例子
關(guān)于自定義協(xié)議,對于會的人很簡單,對于不會的人就摸不著頭腦。下面分享一些關(guān)于自定義協(xié)議的筆記。
什么是協(xié)議?
協(xié)議這個概念我覺得挺雜的。就像嵌入式的概念一樣,說法不一,比如大家常常爭論FPGA是不是嵌入式、單片機是不是屬于嵌入式等等。下面簡單看一下嵌入式中協(xié)議這個概念。
在互聯(lián)網(wǎng)領(lǐng)域,協(xié)議常常指的是網(wǎng)絡協(xié)議。
在嵌入式中,協(xié)議按大類分主要可分為底層協(xié)議(硬件層協(xié)議/物理層協(xié)議)與上層協(xié)議(用戶層協(xié)議應用層協(xié)議),根據(jù)實際還可細分成很多層。底層協(xié)議如串口等,底層協(xié)議決定著數(shù)據(jù)傳輸?shù)姆绞?傳輸數(shù)據(jù)需要多少條信號線,傳輸數(shù)據(jù)的時序是怎樣的)。上層協(xié)議決定著這些數(shù)據(jù)是拿來干什么用的。太難解釋了。。看實例吧:
這是多功能電能表的協(xié)議通訊協(xié)議,其中底層協(xié)議是485通訊,上層協(xié)議有很多條,但格式基本都統(tǒng)一:
每一幀(包)數(shù)據(jù)的格式都類似是這樣子的格式,例如讀數(shù)據(jù)協(xié)議:
主站往從站發(fā)送數(shù)據(jù)(控制器->智能電表):
從站往主站發(fā)送數(shù)據(jù)(智能電表->控制器):
明確了協(xié)議之后,該發(fā)什么數(shù)據(jù)、收到的數(shù)據(jù)是怎么樣我們都心里有數(shù),那么這個通信的過程就很明朗了。一般控制器往外發(fā)送協(xié)議數(shù)據(jù)都比較簡單,重點是返回數(shù)據(jù)的處理(解析),解析方式根據(jù)協(xié)議的不同而有不同的方法。
協(xié)議(上層協(xié)議)按照通用性來分可以分為專有協(xié)議與自定義協(xié)議,例如上面電表的協(xié)議其實是專有協(xié)議(具有一些標準的協(xié)議):
自定義協(xié)議就是我們開發(fā)者可以針對一些應用、一些需求自己制定的一些協(xié)議。下面來分享一些常見的自定義協(xié)議:
常見的自定義協(xié)議
在我們嵌入式開發(fā)中,自定義協(xié)議的應用很多。例如上下位機之間的通訊、控制器與控制器之間的通訊、服務器與設備終端之間的通訊等。自定義協(xié)議也沒有什么特定的規(guī)范、標準,可以很靈活地制定,只要能滿足開發(fā)需要即可。下面依舊以實例來做分享:
例子一(典型):
之前有個物聯(lián)網(wǎng)項目,服務器往我們終端設備發(fā)送的協(xié)議數(shù)據(jù)類似于:
我們設備終端需要用到協(xié)議數(shù)據(jù)中字段的實際數(shù)據(jù),整個數(shù)據(jù)包是字符串的形式,這時候可以用sscanf函數(shù)來做解析:
關(guān)于sscanf函數(shù)就不做解釋了,不會的朋友自行百度。sscanf函數(shù)在做類似的解析非常好用,很多時候都可以使用。如:
因為是兩端通訊,當然要確保通訊的正確性。比如服務器往設備發(fā)送數(shù)據(jù),怎么知道有沒有發(fā)送,這就得設備端在收到數(shù)據(jù)的同時回應相應的數(shù)據(jù)包。可以使用與sscanf函數(shù)相對應的sprintf函數(shù)做組包操作。比如(這個sprintf例子與上例無關(guān),只是為了說明一下sprintf的用法):
一端給另一端發(fā)送數(shù)據(jù)一般有兩種,以設備端在往服務端發(fā)送數(shù)據(jù)為例:
(1)當設備收到服務端的數(shù)據(jù)時,會回應與之對應的數(shù)據(jù),這稱為被動應答。
(2)設備主動給服務端發(fā)送數(shù)據(jù),例如設備常常定時、主動地給服務端發(fā)送一些時間戳信息等(俗稱心跳包),這樣服務端就知道設備是在正常工作的(活著的狀態(tài))。這稱為主動發(fā)送或主動申請。
在處理這些字符串形式的協(xié)議數(shù)據(jù)的時候用sscanf、sprintf、strcmp、strstr、strcat等函數(shù)非常方便,有時候可以搭配正則表達式來做匹配。
例子二(典型):
之前有個項目需要從控制板顯示主控制板的運行狀態(tài),兩控制板之間使用的底層協(xié)議為485協(xié)議。上層協(xié)議(從控板接收數(shù)據(jù)協(xié)議)如:
這里省略的部分為其他信息,比如整個數(shù)據(jù)包的長度等。
解析函數(shù)如:
這里的應用比較簡單,只是解析一個報警信息來顯示。有時候需要用到整個數(shù)據(jù)包里的數(shù)據(jù),這時候我們可以建立一個結(jié)構(gòu)體來保存所有我們需要的數(shù)據(jù),這樣方便我們清晰、有條理地對數(shù)據(jù)進行處理。例如:
例子三(其它):
上面的兩個例子中的自定義協(xié)議是比較典型的、用得比較多的。下面也分享其它我自己的一些例子,很多時候為了滿足我們自己通訊應用的需要,我們也會自己建立一些自己的小協(xié)議來滿足我們的需求。
(1)例子一
之前使用串口屏與STM32通訊的時候,我們有制定一些對應的協(xié)議。
為了讓STM32能識別我串口屏不同頁面發(fā)送的數(shù)據(jù),必須要制定一條協(xié)議來識別頁面:
這樣,每切換至不同的頁面時,就會往STM32發(fā)送關(guān)于頁面的協(xié)議數(shù)據(jù),這樣我們就可以知道當前處于哪個界面。
為了讓STM32能接收到正確的WiFi設置信息(如何區(qū)分WiFi名與密碼),必須要給WiFi信息添加一些輔助協(xié)議數(shù)據(jù),如:
相應的解析處理函數(shù):
(2)例子二
之前在一個單相用電器監(jiān)測的應用中,有用到zigbee無線通訊,即其中一塊控制板做采集板。另一塊控制板做顯示板,有些朋友可能會有疑問為什么不做在同一塊板上?其實這是一道全國大學生電賽題,我們只是根據(jù)題目要求來做的:
我們當時在做這個通訊時也是有制定一個簡單的協(xié)議,在數(shù)據(jù)前面加個標識,就像JSON格式數(shù)據(jù)的鍵值對。
我們制定的協(xié)議如:
相應的解析及結(jié)果:
類似這樣子的協(xié)議解析實際上是有套路的,摸清楚這些套路之后以后在做類似應用的時候其實就很簡單了。重點掌握sscanf、sprintf、strcmp、strstr、strcat等函數(shù)以及上面的兩種典型例子。小編在三個地方搬過磚,每個地方都有用到類似的自定義協(xié)議,而且都形成專門的協(xié)議文檔,每次做類似通訊類的應用的時候,都會按照這樣已份協(xié)議文檔來修改以適應不同的項目。
以上就是本次分享的關(guān)于嵌入式中自定義協(xié)議的一些筆記,希望各位看官喜歡。如有錯誤,歡迎指出,謝謝!
總結(jié)
以上是生活随笔為你收集整理的上下位机通讯协议_嵌入式中自定义协议的一些典型例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qtmessagebox对话框里自定义按
- 下一篇: pythondataframe如何替换值