繁体   English   中英

如何将10位值分配给字节数组?

[英]How can I allocate 10bit values to a byte array?

我需要通过串行端口从微控制器发送数据,并希望尽量减少发送的数据,因为该数据是从ADC读取的10位数据。 所以我想,我会使用工会。 这就是我得到的:

union fortybit
{
 struct
 {
  unsigned int a : 10;
  unsigned int b : 10;
  unsigned int c : 10;
  unsigned int d : 10;
 } tenbits;
 unsigned char bytes[5];
};

现在,我将像这样发送数据:

fortybit fb;
for (int i = 0; i < 640; i++)
{
 fb.tenbits.a = 512;
 fb.tenbits.b = 512;
 fb.tenbits.c = 512;
 fb.tenbits.d = 512;
 Serial.write(fb.bytes, 5);
}

这会导致出现一些奇怪的读数,这些读数是周期性的,并且某些值是正确的,但其中大多数是完全错误的。

我可能做错了什么? 什么是正确的方法?

绝对不要在任何外部表示形式中使用位域。 由于您通过串行线路发送存储位字段的原始字节,因此这成为外部的。

无法知道在串行端口接收端的计算机以相同的方式解释您的struct 它可能具有不同的字节顺序,位打包成的不同本机整数大小(这可能意味着不同的填充)或其他内容。

它根本不是便携式的。

您应该以更可控的方式执行此操作,也许可以通过手动计算所需外部表示形式的每个字节来进行。 这称为序列化 ,这是一件好事。

它不是那样难于打包来改变自己。 这样的事情应该可以解决问题:

int A[4] = { 0x1,0x1,0x1,0x1 };
int B[5];

long long x=0;
for(int i=0; i<4; i++) {
    x |= A[i] << (10*i);
}
for(int i=0; i<5; i++) {
    B[i] = x & 0xFF;
    x >>= 8;
}

printf("%02x %02x %02x %02x %02x\n",B[0],B[1],B[2],B[3],B[4]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM