2010-04-05 48 views
3

我有一個微控制器從很多ADC採樣,並通過無線電以非常低的比特率發送測量結果,帶寬正在成爲問題。在C中創建/解壓大型位域的有效方法?

現在,每個ADC只給我們10位數據,並將其存儲在一個16位整數中。是否有一種簡單的方法將它們以確定性方式打包,以便第一次測量位爲0,第二位爲位10,第三位爲位20等等。

更糟糕的是,單片機是小端的,我無法控制另一端計算機的字節序。

編輯:到目前爲止,我喜歡@ MSN的回答是最好的,但我會的意見作出迴應

@EvilTeach:我不知道確切的位模式將是有益的,或者如何最好只用文本格式化,但我會考慮它。

@Jonathan Leffler:理想情況下,我會將8個10位值包裝成10個8位字節。如果它使處理更容易,我會解決4個字節中的3個值或8個字節中的6個值(儘管2相當於我,相同數量的'浪費'位)

+0

我認爲這將有助於顯示您的傳入位模式的圖表和所需的結果。 – EvilTeach 2010-04-05 01:44:40

+1

「位域」和「可移植性」很少以正面的方式放在同一句話中;位字段不可移植。您是否試圖將3 x 10位值打包成32位整數,或者將6 x 10位值打包成64位整數,或者您是否試圖在較長的內存跨度上連續存儲? – 2010-04-05 01:53:43

回答

3

您可以使用位字段,機器字內排序是沒有定義:

這就是說,它看起來是這樣的:

struct adc_data { 
unsigned first :10; 
unsigned second :10; 
unsigned third :10; 
}; 

編輯:更正,感謝喬納森。

+0

肯定會更像'struct {unsigned first:10;無符號第二:10;無符號第三:10; } adc_data;''?您不需要分配1位和分配9位;你需要分配三組10位,不是你 - 或者不是提問者。 – 2010-04-05 01:50:16

+0

你說得對。我誤解了這個問題。 – 2010-04-05 01:52:09

4

使用位0和31來確定字節順序並在中間打包3個10位值。測試匹配字節順序的一個簡便方法是將位0設置爲0,將位31設置爲1.在接收端,如果位0爲1,則聲明位31爲0並交換字節順序。否則,如果位0爲0,則聲明位31爲1並提取3個值。

0

最簡單的方法是簡單地選擇一個用於傳輸。爲了打包傳輸流中的比特,使用一個累加器(在你的情況下至少有17個比特),在這個累加器中你一次移10個比特並跟蹤其中有多少比特。當你傳輸一個字節時,你從累加器中取出一個字節,從你的計數中減去8,然後將累加器移位8.我在這裏鬆散地使用「傳輸」,你可能存儲在一個緩衝區中供以後傳輸。

例如,如果傳輸是小尾數,那麼在acccumator的頂部(MS位)移入10位,然後從底部取出字節。例如:對於兩個值a和b:

Accumulator  Count 
(MS to LS bit) 
aaaaaaaaaa  10  After storing a 
aa    2  After sending first byte 
bbbbbbbbbbaa 12  After storing b 
bbbb   4  After sending second byte 

接收是一個類似的拆箱操作。

相關問題