繁体   English   中英

使用C从框架中提取数据

[英]Extract data from the frame using C

我的功能如下:

union u_t
{
  uint16_t u16;
  uint8_t u8[2];
};

uint16_t Frame2Data(uint8_t *data,uint8_t startBit,uint16_t length)
{
  uint16_t mask;
  uint8_t start;
  uint8_t firstByte,offset;
  uint8_t numShift;
  union u_t ut;

  for(i=0;i<16;i++)
  {
    if(length == i)
    mask|=(1<<i);
  }

  firstByte = startBit / 8;
  offset = (firstByte+2) * 8;
  start = startBit + length;
  numShift = offset - start;
  ut.u8[1] = data[firstByte];
  ut.u8[0] = data[firstByte+1];
  return (ut.u16 >> numShift) & mask;
}

起始位是46,长度是7,8个字节的数据是0x00 0x09 0x03 0x84 0x03 0x70 0x02 0xA8 我必须从起始位46开始提取数据,直到7位的长度,然后找出其值。 我对数字移位有疑问,我的功能是否正常运行? 如果有人确认这一点就太好了,谢谢。

这里的问题是设置遮罩的方式:

for(i=0;i<16;i++)
{
    if(length == i)
    mask|=(1<<i); /* BTW, mask is not initialized */
}

简直等于:

mask |= (1 << length);

这只会在您的掩码中设置一位。 因此,您可以在for之后从mask构造一个,或者直接设置它:

#define UINT16_WIDTH 16
mask = (1u << (length & (UINT16_WIDTH - 1))) - 1u;

暂无
暂无

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

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