2013-01-14 26 views
0

我知道這可能是錯誤的部分,但我的問題是微控制器編程特定(主要是AVR)!在AVR中的位和字節解釋C

我發送兩個AVR之間的字節ATmega8的使用的Uart其中在字節的每一位代表的東西,只有一個位是在每個字節1發送

所以,如果我要檢查,例如說,第5位在接收的字節那麼如果把它寫成如下:

short byte=UDR; 
if(byte&(1<<5)) 
{ 
// do stuff for bit 5 
} 

然後它總是罰款

,但如果我寫它,因爲這:

short byte=UDR; 
if(byte==0b00100000) 

OR 
short byte=UDR; 
if(byte==0x20) 

然後它不會工作,如果我使用Switch-case而不是if-else,它也會失敗 我無法理解問題,編譯器是否將它解釋爲signed no和第7 Bit作爲符號? 還是別的? 編譯器會從AVR Studio的5

AVR-GNU如果有人問我也有上顯示接收到的字節 ,所以我知道收到的字節是正確的,但由於某種原因,我不能爲條件比較它的接收器的LED!還是會有一些噪聲導致位被Uart誤解,從而改變接收到的實際字節?

幫助!

看出來這裏EVERY ONE

東西就像PARANORMAL

最後,我已經走投無路的問題區域

我加了8個LED代表接收的字節位,這裏是我的發現:

的LED指示燈代表(1 < < 5)0b00100000爲我送

沒關係10

但是

在接收0b00100000時分配給發光的其他LED(不包括8)不發光!

FTW MAN!

我該死的肯定接收到的字節是正確的..但什麼是錯用的if-else和開關的情況下比較

+0

不應該'短字節;'是'uint8_t byte;' - 這是我能想象得最多的。除此之外,這沒有多大意義。 – 2013-01-14 13:20:04

+0

@ H2CO3是的,我只是注意到並刪除了我的評論.. –

回答

3

C沒有對二進制文字語法,你不能鍵入0b00100000和有它編譯。

這很難理解,爲什麼它不適用於== 0x20的情況,因爲我們不知道UDR的價值是特定於您的平臺的。

如果UDR有超過1位的設置,那麼確切的相等性檢查當然會失敗,而單位測試會成功。

您只能使用switch()與精確值對每個case,但你當然可以面膜檢查前:

switch(byte & 0x20) 
{ 
    case 0: 
    break; 
    case 0x20: 
    break; 
} 
+0

什麼版本的C?還是不錯,它在C++中起作用嗎? – Paul

+0

C的標準版本,即在談論C時通常指的是什麼。不,C++也沒有二進制整數文字。 – unwind

+1

嗯,我想這是一些編譯器的功能。我曾經使用0b00000000作爲傳感器陣列的二進制表示。它確實很棒,即使在「開關盒」中也是如此。 我發現C++ 14確實支持它。 http://en.wikipedia.org/wiki/C%2B%2B14#Binary_literals – Paul

3

它不起作用,因爲第二配方改變代碼的含義,而不僅僅是掩碼常量的拼寫。爲了測試一下,你必須應用按位與(&),以恆定的,不只是比較恆定的值:

if (byte & 0b00100000) /* note: 0b00100000 is a gcc extension */ 

或:

if (byte & 0x20)   /* or byte & 32, or byte & (1 << 5), etc. */ 
+0

NOOOOO !!!這不是我正在說的...重讀只有一個高位的問題,如果(byte == 0b00100000)必須等於 if(byte&(1 << 5)) – user1448559

+3

@ user1448559那麼,顯然不是這樣,因爲第一個版本起作用,而第二個版本不起作用。如果您不確定,只需打印收到的值。 – user4815162342

+0

我同意user4815162342。 &是測試位的方式。您可以檢查是否只有一個位是通過與0x20異或設置0來檢查0 – deStrangis