Как написать более компактные условия AND с оператором if?

rfid loop

Я работаю над модулем RFID и нашел пример, который хорошо с этим справляется. Но он долго проверял 5 байт полученных RFID, и я постарался записать его более компактно.

Я сделал это с помощью цикла for, но как выполнить AND условия оператора if?

Как это изменить:

if(bt0[cnt-1] == rfid.serNum[0] &&
   bt1[cnt-1] == rfid.serNum[1] &&
   bt2[cnt-1] == rfid.serNum[2] &&
   bt3[cnt-1] == rfid.serNum[3] &&
   bt4[cnt-1] == rfid.serNum[4]){
   lcd.clear();
   lcd.print("card accepted");
   digitalWrite(green_led,HIGH);
   digitalWrite(red_led,LOW);
 }
 else{
    lcd.clear();
    lcd.print("card denied");
    digitalWrite(green_led,LOW);
    digitalWrite(red_led,HIGH);
}

Что-то вроде этого:

    for(byte i=0;i<MXCD;i++){
      if(bt[i] == rfid.serNum[i%5]){
        cnt++;
      }
    }
    if(cnt==5){
      lcd.clear();
      lcd.print("card accepted");
      digitalWrite(green_led,HIGH);
      digitalWrite(red_led,LOW);
      cnt = 0;
    }
    else{
      lcd.clear();
      lcd.print("card denied");
      digitalWrite(green_led,LOW);
      digitalWrite(red_led,HIGH);
      cnt = 0; 
    }

Таким образом, я сделал это с переменной «cnt», чтобы подсчитать количество успешно совпадающих байтов, тогда проверка числа равна 5.

Есть ли способ лучше этого?

Спасибо за любые комментарии и предложения :)

, 👍0

Обсуждение

Подсказка: для этого существует стандартная функция C — memcmp(). Вы бы использовали это как if (!memcmp(bt, rfid.serNum, 5)) .... Ссылка. http://www.cplusplus.com/reference/cstring/memcmp/, @Mikael Patel

Вау, спасибо !! на самом деле эта функция для меня не нова, но я не думал о ней и о ее использовании в этой ситуации! еще раз спасибо чувак.., @R1S8K

@MikaelPatel, вы должны опубликовать это как ответ, чтобы ОП мог его принять., @Duncan C

Да, ты прав., @R1S8K

Perch Eagle и @MikaelPatel, я хочу кое-что узнать из этого вопроса и вашего принятого ответа, но не понимаю, как это работает. Вы пишете, что хотите сравнить элементы пяти разных массивов (bt0[], bt1[], … bt4[]) с элементами одного массива (rfid.serNum[]). В качестве ответа вас устраивает сравнение с новым массивом bt[]. Чтобы это работало, между bt[] и bt0[], bt1[], … bt4[] должна существовать связь. Где в вашем эскизе это сделано или это естественно, но только я понять не могу?, @RJPlog


1 ответ


Лучший ответ:

2

Для этого существует стандартная функция C: memcmp(). Он выполняет сравнение блоков памяти и может использоваться следующим образом:

if (!memcmp(bt, rfid.serNum, sizeof(bt))) {
  lcd.clear();
  lcd.print("card accepted");
  digitalWrite(green_led,HIGH);
  digitalWrite(red_led,LOW);    
} 
else {
  ...
}

Ссылка. http://www.cplusplus.com/reference/cstring/memcmp/

,

Да, это работает идеально! Спасибо, чувак .., @R1S8K