代码之家  ›  专栏  ›  技术社区  ›  Nate Parsons

在C中创建/解包大位字段的有效方法?

  •  3
  • Nate Parsons  · 技术社区  · 15 年前

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

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

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

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

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

    @乔纳森·莱夫勒:理想情况下,我将8个10位值打包成10个8位字节。如果它使处理更容易,我会在4个字节中选择3个值,或者在8个字节中选择6个值(尽管2个值相当于我,相同数量的“浪费”位)

    3 回复  |  直到 15 年前
        1
  •  4
  •   MSN    15 年前

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

        2
  •  3
  •   Matthew Flaschen    15 年前

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

    也就是说,它看起来像:

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

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

        3
  •  0
  •   ergosys    15 年前

    最简单的一件事就是选择一个来传输。要在传输流中压缩位,请使用累加器(在您的情况下至少为17位),在该累加器中,您一次移位10位,并跟踪其中有多少位。传输字节时,从累加器中取出一个字节,从计数中减去8,然后将累加器移位8。我在这里使用“传输”的方式很松散,你可能会存储到一个缓冲区中,以便以后传输。

    例如,如果传输是小尾数,则在accumator的顶部(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
    

    接收是类似的拆包操作。

    推荐文章