如何在字节变量中设置位(Arduino)

3

我的问题与Arduino有关,但如果您知道如何在C中完成它,使用Arduino IDE也会类似。

我有5个整数变量:

r1、r2、r3、r4、r5

它们的值为0(关闭)或1(开启)。 我想将它们存储在一个字节变量中,称为继电器(relays),而不是将它们相加,而是设置某些位为1/0,无论它们是0还是1。 例如:

1, 1, 0, 0, 1

我想在我的继电器字节变量中具有完全相同的值,而不是 r1+r2+r3+r4+r5,在这种情况下,它将是十进制3,二进制11。

谢谢!

2个回答

2

我建议使用位结构的UNION。这样会使代码更加清晰易懂,也便于移植。你可以指定相邻位的大小,也可以指定单个位。此外,还可以快速重新排列它们。

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

您可以将此 UNION 扩展到大于字节的大小。

请注意,uint8_t 与 byte 相同。

您甚至可以将 union 扩展为字节数组,然后通过串行端口发送字节,或将它们作为一个长字逐个时钟输出等等... 可以参见更详细的示例


最佳答案,但联合体可能对新手来说更难理解。 - rslite

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

或者相反的方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接