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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我也聊聊串口通信协议:用户层通信协议的编制

發(fā)布時間:2025/3/15 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我也聊聊串口通信协议:用户层通信协议的编制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.閑話閑聊

最重要的寫在前面:用戶層通信協(xié)議就是數(shù)據(jù)包格式!!! 沒有進行串口通訊實踐的朋友可能會想:為什么要編制用戶通信協(xié)議呢?通信過程中為什么要進行數(shù)據(jù)處理呢?在設(shè)計中編過串口通信程序的讀者應(yīng)該張口就可以回答:為了按規(guī)定格式從串口發(fā)送數(shù)據(jù),也為了從接收到的數(shù)據(jù)中將需要的信息提取出來 串口通信協(xié)議一般可以從兩個角度來思考:底層通信協(xié)議和用戶層協(xié)議。底層協(xié)議一般有計算機硬件提供商和設(shè)備廠家提供,在一般性的通信編程中很少會涉及(我估計1000個搞通信的,能編底層的也就那么1,2個),而用戶層協(xié)議則是面向使用者的,也就是我們在編程中通常談到的通信協(xié)議。這種用戶層的通信協(xié)議,簡單來說,就是數(shù)據(jù)以何種格式發(fā)送出去,或者說如何從接收到的某種格式的數(shù)據(jù)中提取需要的數(shù)據(jù),以及在發(fā)送和接收過程中如何保證這些數(shù)據(jù)的正確性,即數(shù)據(jù)校驗 這片帖子先扯扯為什么要編?原理是什么?現(xiàn)存的協(xié)議有什么?這些基本問題,為后面逐步深入奠定基礎(chǔ)。

2.為什么要編制用戶通信協(xié)議?

大多數(shù)MFC等界面開發(fā)數(shù)據(jù)都已經(jīng)準(zhǔn)備好了,只需做一個可視化工作就可以了。可是實際很多工作可不是這樣,我們需要實時采集并處理顯示數(shù)據(jù)。舉例子說,我們剛?cè)腴T做通信編程時,大多時候只是從串口接收數(shù)據(jù),并顯示在GUI窗口上。然而我們卻忽略了一個非常關(guān)鍵的細(xì)節(jié):如何從接收到的數(shù)據(jù)中提取有用的信息?如何處理我們發(fā)送出去的數(shù)據(jù)?這些問題才是我們進行通信編程的目標(biāo)所在,也就是說,通信協(xié)議才是對接軟件與硬件交流的關(guān)鍵! 在大多數(shù)編程實踐中,接收與發(fā)送數(shù)據(jù)并不需要直接顯示在程序界面中,而只是需要將對我們有價值的幾個數(shù)據(jù)顯示,或者根本就沒有必要進行顯示,而是直接在程序內(nèi)部進行處理。這是,數(shù)據(jù)發(fā)送方與數(shù)據(jù)接收方就必須事先約好數(shù)據(jù)發(fā)送的格式。當(dāng)然,我說的這個數(shù)據(jù)發(fā)送格式的約定實際上就是數(shù)據(jù)通信協(xié)議!

3.有感而發(fā)——談?wù)凣PS模塊的數(shù)據(jù)接收過程

GPS:Global Positioning System 近年來,GPS系統(tǒng)已經(jīng)在大地繪制、海上漁用、車輛定位監(jiān)控、建筑、農(nóng)業(yè)等各個領(lǐng)域得到廣泛應(yīng)用。目前,市場上的大部分GPS接收模塊都是通過RS-232串口與PC/MCU進行數(shù)據(jù)傳輸。這些數(shù)據(jù)包括了經(jīng)度、緯度、時間、衛(wèi)星使用情況等基本信息。我們需要從GPS接收模塊發(fā)送出來的數(shù)據(jù)中提取出我們要用的信息,比如最簡單的定位信息(只用到了經(jīng)緯信息)。因此,我們就必須了解從GPS模塊獲得的信息,并進行數(shù)據(jù)挑選。 例如,從GPS接收模塊得到的定位信息如下: $GPGGA,hhmmss,dddmm,mmmm,a,dddmm,mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx,*hh<CR><LF> 這實際上是NMEA-0183無線通信輸出格式(National Marine Electronics Association, NMEA, 美國海洋電子協(xié)會)。每次都會發(fā)出像上面格式的一個數(shù)據(jù)串,更多的時候我們都把這個字符串稱為一個數(shù)據(jù)包。
  • $是包頭,GPGGA是包名;
  • hhmmss,dddmm,mmmm,a,dddmm,mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx是數(shù)據(jù)內(nèi)容;
  • *是指包尾;
  • hh為校驗位;
  • <CR>是回車符,ASCII碼值為13;
  • <LF>是換行符,ASCII碼值為10。
這里加上回車符和換行符,只是為了方便調(diào)試。 下面對這個包進行實例化: $GPGGA,033744,2446.5241,N,12100.1536,E,1,10,0.8,133.4,M, , , ,*1F 在我們實際定位的系統(tǒng)中,并不能夠顯示這些數(shù)據(jù)就足夠了,我們還需要實時將有關(guān)的數(shù)據(jù)提取出來,或者在程序中使用,或者提供給第三方。為了提取出“有用的”信息,我們必須要知道該數(shù)據(jù)包的格式定義。具體解釋如下:

知道了GPS的數(shù)據(jù)通信協(xié)議格式,我們便可以得到相應(yīng)的位置信息:北緯24度46.5241分、東經(jīng)121度00.1536分、格林威治時間03點37分44秒、定位衛(wèi)星編號10。 其實,這種GPS必須遵循的數(shù)據(jù)描述格式就稱為通信用戶協(xié)議,這種協(xié)議一般一方單獨建立就好,另一方只需要依據(jù)這樣的協(xié)議來進行數(shù)據(jù)接收與發(fā)送就好! 這其實也能深刻地解釋為什么我們要編制用戶協(xié)議。

4.串口通信中用戶層協(xié)議編制原理

在串口用戶層的通信協(xié)議中,一般是圍繞發(fā)送方如何建立數(shù)據(jù)包和接收方如何處理數(shù)據(jù)包,并從數(shù)據(jù)包中提取出我們關(guān)心的信息。通信協(xié)議也為這個事兒進行服務(wù)。實際上,用戶層的通信協(xié)議沒有那么嚴(yán)謹(jǐn),隨意一點就好......但是,還是有那么幾個原則需要我們嚴(yán)格遵守:

4.1 數(shù)據(jù)包必須有包頭

包頭是供接收方判斷一個數(shù)據(jù)包開始傳輸?shù)闹匾獦?biāo)志,接收方從收到的數(shù)據(jù)中判斷接收到了包頭,就認(rèn)為接收的數(shù)據(jù)已經(jīng)開始,真正的數(shù)據(jù)信息馬上就會到達(dá)。但是,我們必須要切記一點,包頭字符必須有別于數(shù)據(jù)信息,也就是說,這種特征是數(shù)據(jù)包中其他數(shù)據(jù)沒有的,否則會造成混亂。

4.2 非定長數(shù)據(jù)必須有包尾

這個很少用,用也很好理解

4.3 定長數(shù)據(jù)應(yīng)該指明長度

對于長度不變的數(shù)據(jù)包,數(shù)據(jù)長度應(yīng)該事先約定。這樣接收方在知道接受長度之后,就能夠判斷接收的數(shù)據(jù)包是否結(jié)束。

4.4 建議對數(shù)據(jù)進行校驗

串口通信底層協(xié)議(機器硬件實現(xiàn))已經(jīng)設(shè)置了奇偶檢驗方式。其實,如果在用戶層添加新的校驗,可以對數(shù)據(jù)進行進一步的排錯,這樣可以更好地保證數(shù)據(jù)的正確性。

4.5 換行符的使用

如果是要顯示數(shù)據(jù),前列推薦在數(shù)據(jù)包的結(jié)尾添加換行符,方便閱讀接收到的數(shù)據(jù)。然而,如果僅把接收到的數(shù)據(jù)作為基礎(chǔ)數(shù)據(jù),那就沒有必要了......

4.6 如果更新快的數(shù)據(jù),建議盡量簡短

如果要求數(shù)據(jù)更新快,就要讓每次傳輸?shù)臄?shù)據(jù)盡量短。

5.在串口通信中幾種常用的用戶層協(xié)議

在常見的用戶層協(xié)議中,按照輸出數(shù)據(jù)的可讀性可以分為完整性協(xié)議和簡單型協(xié)議,NMEA-0183無線通信輸出協(xié)議,包含了包頭、數(shù)據(jù),包尾、校驗、換行,而且數(shù)據(jù)之間還有逗號分隔,觀察數(shù)據(jù)非常方便。但是數(shù)據(jù)包長度增加,發(fā)送時間也會增加,這在很多更新快的場合是不合適的;簡單型協(xié)議則去掉了在程序中不需要利用的換行與分隔符,有時甚至連校驗也省略了。

5.1 NMEA-0183無線通信協(xié)議

5.2 自定義的通信協(xié)議

自定義通信協(xié)議可以設(shè)置的非常簡單,也可以為了查看方便,設(shè)置得比較復(fù)雜。簡單的協(xié)議一般需要傳送的信息比較簡單,而且沒必要直接進行觀察。 以四字節(jié)組成的通信協(xié)議為例,進行深入研究:



這個簡單的例子,可以說明,僅僅是4個字節(jié)的通信協(xié)議就可以傳送大量的信息,而且還加入了校驗,在實際的應(yīng)用中,我們還是應(yīng)該進行協(xié)議的擴充!

6.總結(jié)

在實際應(yīng)用中,我們能看到各種協(xié)議,但是它們的實質(zhì)都是一樣的。首先,對數(shù)據(jù)進行“打包”發(fā)送;然后接收方,對數(shù)據(jù)進行“拆包”。進而對數(shù)據(jù)包中的數(shù)據(jù)進行處理,或是提取有用的數(shù)據(jù),或是進行編碼翻譯,這也是下一部分,將要討論的話題。






總結(jié)

以上是生活随笔為你收集整理的我也聊聊串口通信协议:用户层通信协议的编制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。