2

バイトと uint8_t の値を理解するのに苦労しています。

心拍数サービス プロトコルを介して Bluetooth 4.0 心拍数モニターからデータを読み取る Apple によって作成されたサンプル プロジェクトを使用しています。サンプル プロジェクトは、以下のように心拍数データを提供します。

- (void) updateWithHRMData:(NSData *)data 
{
const uint8_t *reportData = [data bytes];
uint16_t bpm = 0;

if ((reportData[0] & 0x01) == 0) 
{
    /* uint8 bpm */
    bpm = reportData[1];
} 
else 
{
    /* uint16 bpm */
    bpm = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[1]));
}

(reportData[0] & 0x01) はデータ配列 reportData の最初のデータ ビットを返すと仮定していますが、2 番目にアクセスする方法がわかりません (reportData[0] & 0x02) は思ったように機能しません。理想的には、reportData[0] のすべてのデータをチェックし、それに基づいて、保存されている場所に応じて reportData[4] または [5] の rr 間隔データを取得し、それを反復して各値を取得します。そこには複数の値が格納されている可能性があります。

私が知っている初心者の質問ですが、答えを見つけるのに苦労しています。実際、答えを確立するための検索用語も見つかりません。

4

3 に答える 3

2

そうするとreportData[0]、最初のバイトが取得されます (インデックス 0)。その値を と組み合わせるとreportData[0] & 0x02、2 番目のビット以外はすべてマスクされます。この結果は、0 (ビット 2 が設定されていない場合) または 2 (2 番目のビットが設定されている場合) になります。

if ((reportData[0] & 0x02) == 0) {
    // bit 2 of first byte is not set
} else {
    // bit 2 of first byte is set
}

8ビットすべてをチェックしたい場合は、次のようにします。

uint8_t byte = reportData[0];
for (int i = 0; i < 8; i++) {
    int mask = 1 << i;
    if ((byte & mask) == 0) {
        bit i is not set
    } else {
        bit i is set
    }
}

更新: 2 ビットにまたがる値を抽出するには、次のようにします。

uint8_t mask = 0x01 | 0x02; // Good for value stored in the first two bits
uint8_t value = byte & mask; // value now has just value from first two bits

抽出する値が上位ビットにある場合は、追加の手順があります。

uint8_t mask = 0x02 | 0x04; // Good for value in 2nd and 3rd bits
uint8_t value = (byte & mask) >> 1; // need to shift value to convert to regular integer
于 2013-03-18T21:49:54.247 に答える
1

サンプル コードの説明については、この投稿を確認してください。この投稿は、エンディアン チェックが実行されている理由を理解するのに役立つBluetooth 仕様へのリンクも示しています (基本的には、最大の移植性を保証するのは Apple です)。基本的に、1 バイト目は HRV データのフォーマットと EE および RR 間隔データの有無を記述するビット フィールドです。そう:

reportData[0] & 0x03

EE データが存在するかどうかを示します (1 = はい、0 = いいえ)。

reportData[0] & 0x04

RR 間隔データが存在するかどうかを示します (1 = はい、0 = いいえ)

次に、RR間隔データを取得できます

uint16_t rrinterval;
rrinterval = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[idx]));

どこidxで実行した存在/不在テストによって決定されます。あなたが示しているように、オフセットはBTWで固定されていないと仮定しています(つまり、存在/不在に基づく動的オフセット)-BT仕様に精通していません。フォーマット固​​定されている場合、この場合、RR データはオフセット 7 になります。

于 2013-03-18T22:13:56.307 に答える