2014-02-19 28 views
3

我的問題是Arduino的具體問題,但如果您知道如何在C中使用它,它在Arduino IDE中也會類似。如何在字節變量中設置位(Arduino)

所以,我有5個整數變量:

R1,R2,R3,R4,R5

它們的值爲0(關閉)或1(開)。 我想這些存儲在一個字節變量讓我們把它轉發,不加入他們,但設置某些位1/0無論是0或1 例如:

1,1,0,0 ,1

我想在我的繼電器的字節變量的值完全相同,不 R1 + R2 + R3 + R4 + R5在這種情況下將是十進制3,二進制11.

謝謝!

回答

1

如何:

char byte = (r1 << 4) | (r2 << 3) | (r3 << 2) | (r4 << 1) | r5; 

或者周圍的其他方式:

char byte = r1 | (r2 << 1) | (r3 << 2) | (r4 << 3) | (r5 << 4); 
+0

感謝它工作正常,除了我需要它倒序。 – user3329848

+0

@ user3329848查看編輯答案。 –

1

我建議使用位的結構的統一。它增加了清晰度,便於攜帶。您可以指定單個或任何大小的相鄰位。隨着快速重新安排他們。

union { 
    uint8_t BAR; 
    struct { 
    uint8_t r1 : 1; // bit position 0 
    uint8_t r2 : 2; // bit positions 1..2 
    uint8_t r3 : 3; // bit positions 3..5 
    uint8_t r4 : 2; // bit positions 6..7 
    // total # of bits just needs to add up to the uint8_t size 
    } bar; 
} foo; 

void setup() { 
    Serial.begin(9600); 
    foo.bar.r1 = 1; 
    foo.bar.r2 = 2; 
    foo.bar.r3 = 2; 
    foo.bar.r4 = 1; 

    Serial.print(F("foo.bar.r1 = 0x")); 
    Serial.println(foo.bar.r1, HEX); 
    Serial.print(F("foo.bar.r2 = 0x")); 
    Serial.println(foo.bar.r2, HEX); 
    Serial.print(F("foo.bar.r3 = 0x")); 
    Serial.println(foo.bar.r3, HEX); 
    Serial.print(F("foo.bar.r4 = 0x")); 
    Serial.println(foo.bar.r5, HEX); 

    Serial.print(F("foo.BAR = 0x")); 
    Serial.println(foo.BAR, HEX); 
} 

在這裏您可以擴大這個聯盟比字節的

注uint8_t是相同的字節。

甚至可以將聯合擴展爲一個字節數組,然後通過串行端口發送字節或將它們作爲一個長字等單獨發送出去......參見更多extensive example

+0

最佳答案,但工會可能很難理解新手 – rslite