2011-03-31 14 views
0

當我們讀16位十六進制數爲兩個8我們正在編寫I2C接口, 代碼的形式轉換十六進制MSB和LSB,我們將這些值作爲「未簽名字符」返回。嵌入式C,如何返回的十六進制值在「無符號的字符」爲可用的「整數」型

我們想連接這些MSB和LSB 「字符」值,最後我們需要一個「整數」爲我們進一步的處理值。

例如:下面的2種方法正在返回一個「無符號字符」值,每個

1)

unsigned char i2c_readAck(void) 
{ 
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); 
    while(!(TWCR & (1<<TWINT))); 

    return TWDR; 

}/* i2c_readAck */ 

2)

unsigned char i2c_readNak(void) 
{ 
    TWCR = (1<<TWINT) | (1<<TWEN); 
    while(!(TWCR & (1<<TWINT))); 

    return TWDR; 

}/* i2c_readNak */ 

我們必須取MSB和LSB來自這2種方法誰是實際十六進制值需要, 但在無符號的字符類型的值,它串聯,並最終連接值必須轉換爲可用的整數格式,

我們發現對話部分非常棘手, 任何人都可以幫助我們?

回答

2

你只需要像這樣:

unsigned char msb = ...; // read MSB 
unsigned char lsb = ...; // read LSB 
int val = (msb << 8) | lsb; // combine MSB and LSB to make an int 
+0

保羅,我們只是很新的嵌入式C,所以再次問這個問題,請不介意,所看到的MSB和LSB值是數據類型的「字符「,我們可以直接對它進行按位操作嗎?然後我們可以直接將它存儲在「int」中,而不需要進行類型轉換..不會是類型轉換問題? – 2011-03-31 15:20:02

+0

謝謝你保羅,用於即時回答吧... ..請回答我上面的採石場也 – 2011-03-31 15:25:36

+0

@Balaji KR:char型只是一個小int和它會隱含地促進了上述表達爲int - 我建議!你只需嘗試上面的代碼,看看它是否適合你。 – 2011-03-31 15:32:05

0

是的,這是非常棘手,很難想象。請記住,您獲得的MSB和LSB(可能)是您需要的實際二進制表示形式;你不需要轉換這些東西。這就是i2c的工作原理。所以:

int number = 0, msb, lsb; 

    msb = 0xff & read_one_unsigned_i2c_byte(); 
    lsb = 0xff & read_one_unsigned_i2c_byte(); 

    number = msb << 8;  // gotta' shift msb to upper 8 bits of final result 
    number = number | lsb; // and then IOR in the lower 8 bits 

- 皮特

+0

感謝你洙多皮特,其實我開始對Java的工作,我感到害怕在每一步前進編寫的代碼,因爲我在它可視化的類型轉換錯誤..!正如我所說的只是可視化,我退一步來寫代碼..大聲笑。 – 2011-03-31 15:33:14

+0

是的,大聲笑,但不要擔心。當你嘗試上面給出的兩個解決方案之一時,你會發現它像一個冠軍一樣工作。 – 2011-03-31 15:40:02

相關問題