前些天跟大家解釋了如下代碼:
offset=len/64+!!(len%64);
并且跟大家詳細聊了一下其中的!!操作,然而這段代碼的主要功能還是為了進行分包處理,既然是分包自然而然就會想到一種常用的分包處理方法,這也是本文的重點。
數(shù)據(jù)分包在嵌入式軟件開發(fā)中算是一種非常常見的處理,其主要原因還是硬件上的各種限制,不得已而為之,特別是在通信協(xié)議的定制過程中尤為常見。
1
傳輸限制
玩過各種通信協(xié)議的朋友都知道,像非常多的通信方式都是以數(shù)據(jù)幀的形式來進行傳遞,不同的通信方式因各方面的因素又存在一個最大傳輸字節(jié)數(shù)的限制,考慮到穩(wěn)定性、容錯性等等對單次發(fā)送的數(shù)據(jù)長度進行限制,又或者所接收的設備其內存資源有限,不足以接收、處理過長的數(shù)據(jù)包。
像zigbee這樣的物理層每幀最大只能傳輸127個字節(jié),通過每層不斷的封包到應用層后每包才100個字節(jié)。當上層用戶協(xié)議的數(shù)據(jù)包過大,無法一次性傳輸,就只能分包或者分組下發(fā),最終接收方組包后解析提取數(shù)據(jù)。
2
分包設計的考慮
有些朋友該說了,我就不喜歡搞大包發(fā)送,使用短包,然后通過不同的標識進行不同數(shù)據(jù)位的定義,簡單很多。
當然長包與短包并沒有本質上的區(qū)別,其目的都是傳輸數(shù)據(jù),但在實踐的過程中還是會遇到居多處理上的區(qū)別:
數(shù)據(jù)的同步性方面:
比如當通信的設備轉速超了,同時報了一個故障碼,如果采用短包上傳,很可能故障碼和轉速位于不同的數(shù)據(jù)包中,當數(shù)據(jù)包丟包或許是亂序,就會導致當接收到故障碼的時候,此時超標的轉速值已經(jīng)丟失或者延時等,有概率不能準確獲得故障時的超標轉速。
而使用長包,只需要發(fā)送方能夠保證打包的時候同步,那么接收方就可以同步獲得相應的數(shù)據(jù)。
通信協(xié)議設計自由度方面:
在設計協(xié)議的時候,長包會更加的自由,大多數(shù)情況都不需要考慮大數(shù)據(jù)傳輸?shù)?/span>占位問題,甚至在編碼上直接copy結構體發(fā)送也是相當方便的。
3
計算包數(shù)問題
既然長包的設計相對比較方便。那分包處理是少不了的?
分包還不簡單?
要發(fā)100個字節(jié)的數(shù)據(jù),每次只能發(fā)15個,那發(fā)送7包就可以了,直接編碼,代碼如下:
SendPack=SendNum/PackNum;
if(SendPack%PackNum)SendPack++;
這算是常規(guī)操作,如果覺得有點難度,還要多敲敲代碼。
一般用C語言比較久的朋友都想去簡化這種操作,畢竟實現(xiàn)一個簡單的功能需要兩行代碼,強迫癥,忍不了~
就有了本文開頭的!!處理方式,或者如下處理也是一樣的:
#include
僅僅只是秀了一下C語言的幾個小技巧罷了,并沒有實質性的改善。
很明顯,本文的重點并不是介紹如上兩種辦法,而是如下更加高效的代碼:
PackNum=(total+(singleNum-1))/singleNum;
對于一些以往沒有使用的朋友或許有點懵,那bug菌這是嘮叨幾句:
該表達式主要是利用了取整的特性來達到+1的目的。
直接除單包個數(shù),不能整除的情況,結果都會少1,比如10/6,應該是2包,而由于最終除法結果只能是1。
所以通過補償(singleNum - 1)后,結果就分兩種情況:
1、原本能夠整除的數(shù),補償后無法整除,結果與之前一致;
2、原本不能夠整除的數(shù),其余數(shù)必然在【1~(singleNum- 1)】之間,所以補償以后,其余數(shù)范圍在【singleNum~(singleNum+ singleNum- 2)】,則其結果為整除部分+1。
與我們分包個數(shù)是一致的,相當巧妙。
4
擴展
這種方法不僅僅只是用于通信的分組中,把思維進一步泛化。
只要是類似分組的處理都可以使用該算法。
比如內存的分區(qū),flash的設計上都是一個扇區(qū)一個扇區(qū)的分布。
現(xiàn)在想分配整數(shù)個扇形區(qū)域用于存儲某些數(shù)據(jù),每一個扇區(qū)512個字節(jié),存儲2000個字節(jié)的數(shù)據(jù),該分配幾個扇區(qū)?
我相信你已經(jīng)有答案了~
審核編輯 :李倩
-
嵌入式
+關注
關注
5192文章
20274瀏覽量
331695 -
ZigBee
+關注
關注
158文章
2303瀏覽量
249469 -
C語言
+關注
關注
183文章
7642瀏覽量
145116
原文標題:嵌入式數(shù)據(jù)分包以及相關技巧
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
嵌入式驅動開發(fā),需要掌握哪些技能?
arm嵌入式主板優(yōu)缺點
CW32嵌入式軟件開發(fā)的必備知識
嵌入式與FPGA的區(qū)別
嵌入式系統(tǒng)的定義和應用領域
盤點嵌入式就業(yè)所需要的技能有哪些?
入行嵌入式應該怎么準備?
Linux嵌入式和單片機嵌入式的區(qū)別?
嵌入式開發(fā)入門指南:從零開始學習嵌入式
嵌入式適合自學嗎?
飛凌嵌入式「2025嵌入式及邊緣AI技術論壇」議程公布
嵌入式去哪個城市好?
如何成為嵌入式開發(fā)工程師?
嵌入式機器學習的應用特性與軟件開發(fā)環(huán)境
嵌入式數(shù)據(jù)分包以及相關技巧
評論