我也聊聊串口通信协议:用户层通信协议的编制
生活随笔
收集整理的這篇文章主要介紹了
我也聊聊串口通信协议:用户层通信协议的编制
小編覺得挺不錯的,現(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)鍵的細節(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。
知道了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é)議沒有那么嚴謹,隨意一點就好......但是,還是有那么幾個原則需要我們嚴格遵守:4.1 數(shù)據(jù)包必須有包頭
包頭是供接收方判斷一個數(shù)據(jù)包開始傳輸?shù)闹匾獦?biāo)志,接收方從收到的數(shù)據(jù)中判斷接收到了包頭,就認為接收的數(shù)據(jù)已經(jīng)開始,真正的數(shù)據(jù)信息馬上就會到達。但是,我們必須要切記一點,包頭字符必須有別于數(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 评论:索尼爱立信能否重振雄风?
- 下一篇: 【飞秋】使用C# 4编写动态的代码