1

10 BYTE配列パケットを携帯電話に送信する Bluetooth モジュールがあります。

最初の 2 バイト (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 に答える