有没有更简洁的方法来做到这一点? C ++ IF

时间:2015-11-14 20:09:30

标签: c++ arduino

有没有更简洁的方法来做这些代码?

它只是检查所有电线是否已连接&如果他们没有,那么在连接到arduino的液晶显示屏上就会失败。

report.send(buffer) # this validate buffer[0] matches report id

device.send_output_report(buffer) # this will send anything to your device

11 个答案:

答案 0 :(得分:6)

你可以把它放在一个函数中,使它更具可读性:

bool all_wires_low()
{
    return
        digitalRead(wire_BROWN) == LOW &&
        digitalRead(wire_ORANGE) == LOW &&
        digitalRead(wire_RED) == LOW &&
        digitalRead(wire_GREEN) == LOW &&
        digitalRead(wire_BLUE) == LOW &&
        digitalRead(wire_PURPLE) == LOW &&
        digitalRead(wire_GREY) == LOW &&
        digitalRead(wire_WHITE) == LOW &&
        digitalRead(wire_BLACK) == LOW;
}

// elsewhere:
if( all_wires_low() )
{
    lcd.print(pass);
    delay(3000);
    lcd.clear();
    lcd.print("Status: ARMED");
    testPassed = true;
}
else
{
    lcd.print(fail);
}

答案 1 :(得分:3)

当拥有多个变量时,以一种允许循环遍历它们而不必编写重复代码的方式枚举它们总是更简单。我个人喜欢将它们组织在一个单独的文件中,它更简洁,更容易添加新值 -

typedef enum {
#define DEF_WIRE(x) WIRE_ ## x,
#include "wires.def"
} wire_types;

int main() {

    bool testPassed = true;
    for (int wire = 0; wire < WIRE_MAX; ++wire) {
        testPassed &= (digitalRead(wire) == LOW);
    }
    if (testPassed) {
        lcd.print(pass);
        delay(3000);
        lcd.clear();
        lcd.print("Status: ARMED");
    } else {
        lcd.print(fail);
    }
}

其中wires.def有:

DEF_WIRE(BROWN)
DEF_WIRE(ORANGE)
DEF_WIRE(RED)
DEF_WIRE(GREEN)
DEF_WIRE(BLUE)
DEF_WIRE(PURPLE)
DEF_WIRE(GREY)
DEF_WIRE(WHITE)
DEF_WIRE(BLACK)
DEF_WIRE(MAX)
#undef DEF_WIRE

另一个好处是,它允许你做这样酷的事情:

const char* wire_names[] = {
#define DEF_WIRE(x) #x,
#include "wires.def"
};

然后

printf("wire %s is LOW\n", wire_names[wire]);

答案 2 :(得分:2)

您可以使用&#39;和&#39;运算符&&,用于组合多个条件:

if (digitalRead(wire_BROWN) == LOW &&
    digitalRead(wire_ORANGE) == LOW &&
    digitalRead(wire_RED) == LOW &&
    digitalRead(wire_GREEN) == LOW &&
    digitalRead(wire_BLUE) == LOW &&
    digitalRead(wire_PURPLE) == LOW &&
    digitalRead(wire_GREY) == LOW &&
    digitalRead(wire_WHITE) == LOW &&
    digitalRead(wire_BLACK) == LOW){

  lcd.print(pass);
  delay(3000);
  lcd.clear();
  lcd.print("Status: ARMED");
  testPassed = true;
} 
else {
  lcd.print(fail);
}

答案 3 :(得分:2)

你可以尝试

if ( (digitalRead(wire_BROWN) == LOW) && (digitalRead(wire_ORANGE) == LOW) && ... /* other checks */)
{
   lcd.print(pass);
   delay(3000);
   lcd.clear();
   lcd.print("Status: ARMED");
   testPassed = true;
}else
{
   lcd.print(fail);
}

答案 4 :(得分:1)

让我们回答一个回答问题的信号: 是所有信号都低或至少其中一个信号高。 这个答案由简单的&#39;&#39;提供。切换保证将所有信号组合起来产生一个信号并为问题提供明确答案 - 所有信号都是低电平?

将该信号的结果与LOW进行比较。

  if((digitalRead(wire_BROWN)  &
    digitalRead(wire_ORANGE) & 
    digitalRead(wire_RED)    &
    digitalRead(wire_GREEN)  &
    digitalRead(wire_BLUE)   &
    digitalRead(wire_PURPLE) &
    digitalRead(wire_GREY)   &
    digitalRead(wire_WHITE)  &
    digitalRead(wire_BLACK) ) & LOW)
    {
    ....
    ...
    }

答案 5 :(得分:0)

你应该使用&amp;&amp;缩短你的代码。此外,如果您的电线变量位于同一个PORT,您可能能够AND(&amp;)它们。

反正:

if(digitalRead(wire_BROWN) == LOW && digitalRead(wire_ORANGE) == LOW && ... ) {
   lcd.print(pass);
   delay(3000);
   lcd.clear();
   lcd.print("Status: ARMED");
   testPassed = true;
} else {
   lcd.print(fail);
}

答案 6 :(得分:0)

只需使用and运算符&&,因为短路 if 语句变为false只要对digitalRead的任何来电都无法返回LOW

if ((digitalRead(wire_BROWN) == LOW) &&
    (digitalRead(wire_ORANGE) == LOW) &&
    (digitalRead(wire_RED) == LOW) &&
    (digitalRead(wire_GREEN) == LOW) &&
    (digitalRead(wire_BLUE) == LOW) &&
    (digitalRead(wire_PURPLE) == LOW) &&
    (digitalRead(wire_GREY) == LOW) &&
    (digitalRead(wire_WHITE) == LOW) &&
    (digitalRead(wire_BLACK) == LOW)) {
                lcd.print(pass);
                delay(3000);
                lcd.clear();
                lcd.print("Status: ARMED");
                testPassed = true;
    } else {
        lcd.print(fail);
    }

答案 7 :(得分:0)

我建议使用布尔变量和逻辑:

bool all_wires_connected = true;
all_wires_connected = all_wires_connected && (digitalRead(wire_BROWN) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_ORANGE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_RED) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_GREEN) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_BLUE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_PURPLE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_GREY) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_WHITE) == LOW);
all_wires_connected = all_wires_connected && (digitalRead(wire_BLACK) == LOW);
if (all_wires_connected)
{
    lcd.print(pass);
    delay(3000);
    lcd.clear();
    lcd.print("Status: ARMED");
    testPassed = true;
}
else
{
    lcd.print(fail);
}

这可能会鼓励编译器使用有条件执行的指令。

答案 8 :(得分:0)

由于这是一种嵌入式系统,我建议调查digitalRead()函数或宏的内容。

代码看起来像每个线颜色表示为整数内的一个位。有一种简单的方法可以测试是否设置或清除所有位(取决于LOWHIGH的表示)。

例如,如果LOW == 0,则可以读取连线值并与零进行比较(一个if语句)。读取零值意味着所有位都为零,因此所有导线都为低电平。

一个if语句比9个if语句更容易管理。

答案 9 :(得分:0)

恕我直言,最好的解决方案是将它们放在一个数组中:

int allWires[] = { wire_BROWN, wire_ORANGE, wire_RED, wire_GREEN, wire_BLUE, wire_PURPLE, wire_GREY, wire_WHITE, wire_BLACK };

然后迭代它们:

testPassed = true;
for (i = 0; i < sizeof(allWires)/sizeof(int); i++)
{
    if (digitalRead(allWires[i]) == LOW)
        testPassed = false;
}

if (testPassed)
{
    lcd.print(pass);
    delay(3000);
    lcd.clear();
    lcd.print("Status: ARMED");
}
else
    lcd.print(fail);

答案 10 :(得分:0)

创建一个位掩码,并使用您的端口布尔与它: https://www.arduino.cc/en/Tutorial/BitMask

顺便说一句。阅读端口是: https://www.arduino.cc/en/Reference/PortManipulation

掩码如下所示: 00011111 其中0表示连接到彩色线以外的所有位,1表示您要测试的...

你将使用两个端口:

byte MASK2 = some bit pattern depending on wire arrangements;
byte MASK1 = some bit pattern depending on wire arrangements;
int PORTA = 
if(( MASK1 & PIND + MASK2 & PINB ) == 0)
{
    //code
}

这个答案必须等于0。