3

我有一个微控制器从许多 ADC 中采样,并以非常低的比特率通过无线电发送测量结果,带宽正在成为一个问题。

现在,每个 ADC 只给我们 10 位数据,并且它被存储在一个 16 位整数中。有没有一种简单的方法以一种确定的方式打包它们,以便第一次测量在第 0 位,第二次在第 10 位,第三次在第 20 位,等等?

更糟糕的是,微控制器是小端的,我无法控制另一端计算机的字节序。

编辑:到目前为止,我最喜欢@MSN 的回答,但我会回复评论

@EvilTeach:我不确定确切的位模式是否有帮助,或者如何最好地用文本格式化它,但我会考虑的。

@Jonathan Leffler:理想情况下,我会将 8 个 10 位值打包成 10 个 8 位字节。如果它使处理更容易,我会满足于 4 个字节中的 3 个值或 8 个字节中的 6 个值(尽管 2 与我等价,相同数量的“浪费”位)

4

3 回答 3

4

使用位 0 和 31 来确定字节顺序并在中间打包 3 个 10 位值。测试匹配字节序的一种简单方法是将位 0 ​​设置为 0,将位 31 设置为 1。在接收端,如果位 0 为 1,则断言位 31 为 0 并交换字节序。否则,如果位 0 为 0,则断言位 31 为 1 并提取 3 个值。

于 2010-04-05T01:52:08.993 回答
3

您可以使用位域,但未定义机器字内的顺序:

也就是说,它看起来像:

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

编辑:更正,感谢乔纳森。

于 2010-04-05T01:36:58.027 回答
0

关于字节序,最简单的做法是简单地为您的传输选择一个。要打包传输流中的位,请使用累加器(在您的情况下至少为 17 位),在其中一次移入 10 位并跟踪其中有多少位。当你传输一个字节时,你从累加器中取出一个字节,从你的计数中减去 8,然后将累加器移动 8。我在这里松散地使用“传输”,你可能存储到缓冲区中以供以后传输。

例如,如果传输是小端,则在累加器顶部(在其 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

接收是类似的拆包操作。

于 2010-04-05T02:24:21.007 回答