1

我有一个蓝牙模块,它正在向我的手机发送一个 10字节的阵列数据包。

我需要获取前两个字节 (0, 1) 并将它们合并在一起并将它们发送到图形查看器。(0 = 高字节 1 = 低字节)。

字节长 12 位。

这是我迄今为止的尝试:

// streamDelegate gave us some data, hand it over to print out
 - (void)receivedData:(uint8_t *)data length:(NSUInteger)len {

uint16_t iChanI = 0;
uint16_t iChanQ = 0;

iChanI = ((data[0] <<8) + data[1]);
iChanQ = ((data[4] <<8) + data[5]);

[sView Update: iChanI : iChanQ];
[sView setNeedsDisplay];

}

我不确定 unit8_t 是否是传入数据的正确格式。

目前从图表输出的值比我预期的要大得多。

任何帮助表示赞赏。

4

1 回答 1

0

您可能有错误的字节序(哪个字节最重要)。所以试试

iChanI = ((data[1] <<8) + data[0]);

和/或
您在 iChanI 的 4 MSBits 中有意外数据。将这些位归零:

iChanI &= 0x0FFF;

一起

iChanI = ((data[1] <<8) + data[0]) & 0x0FFF;

对 做同样的事情iChanQ


您可以改为创建一个类型

typedef struct {
  uint16_t iChanI;
  uint16_t spare1;
  uint16_t iChanQ;
  uint16_t spare3;
  uint16_t spare4;
  } PhonePAcket_t;  // Ten byte packet

(void)receivedData:(uint8_t *)data length:(NSUInteger)len {
  const PhonePAcket_t *pp = (const PhonePAcket_t*) data;
  uint16_t iChanI = pp->iChanI & 0x0FFF;
  uint16_t iChanQ = pp->iChanQ & 0x0FFF;

 [sView Update: iChanI : iChanQ];
 [sView setNeedsDisplay];
}

我避免使用位数组,但可以使用它们。
可能需要包装属性。我对你的情况细节不够熟悉。

于 2013-06-05T18:36:03.023 回答