2013-06-05 60 views
1

我有一個藍牙模塊發送10 BYTE陣列數據包到我的手機。獲取數組中的字節值併合並它們。

我需要得到前兩個字節(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是在數據未來的正確格式

目前從圖形輸出的值是比我大很多期望。

任何幫助表示讚賞。

+0

到目前爲止,這看起來不錯。對於這種操作,uint8_t是一個合理的類型,您不應該遇到帶符號數字和位移的意外。你確定「[sView更新:iChanI:iChanQ];」是正確的(我的目標-C有點生疏,但我不記得帶有兩個未命名參數的調用) – Nicholaz

+0

sView update正在輸出一個雙通道圖。我是否正確地移動了數據,應該是8還是12? – user1845029

+0

「字節長度爲12位」?那不是一個字節,那麼,是嗎? [我故意忽略C標準定義,它說「一個char是一個字節,並且char的大小可以是任意大小的」,因爲我嚴重懷疑這個代碼是在具有12,24或36位字的機器上運行的,每字符12位] –

回答

0

你可能有錯誤的endian(哪個字節是最重要的)。因此,嘗試

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

和/或
你必須在4個MSb iChanI的意外數據。零這些位:

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]; 
} 

我避免比特串,但它們也可以使用。
可能需要打包屬性。我對你的情況的細節不夠熟悉。

相關問題