2010-04-05 51 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 

接收是一个类似的拆箱操作。

相关问题