Как получить строку и байт для сравнения? - PullRequest
0 голосов
/ 28 мая 2019

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

Я пробовал много разных способов исправить это, но библиотека firebase не имеет функции getbyte.

int UID1 = 2;
int UID2 = 2;
int UID3 = 2;
int UID4 = 2;
int UID5 = 2;
int UID6 = 2;

byte nuidPICC[4];

constexpr uint8_t RST_PIN = 5; // Configurable, see typical pin layout above
constexpr uint8_t SS_PIN = 4;  // Configurable, see typical pin layout above

MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;

// Init array that will store new NUID

void setup() {
  Serial.begin(115200);
  SPI.begin();     // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  delay(2000);
  Serial.println('\n');

  wifiConnect();

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

  delay(10);
}

void loop() {

  // Look for new cards
  if (!rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if (!rfid.PICC_ReadCardSerial())
    return;

  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
      piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
      piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }

  if (rfid.uid.uidByte[0] != nuidPICC[0] ||
      rfid.uid.uidByte[1] != nuidPICC[1] ||
      rfid.uid.uidByte[2] != nuidPICC[2] ||
      rfid.uid.uidByte[3] != nuidPICC[3]) {
    Serial.println(F("A new card has been detected."));

    // Store NUID into nuidPICC array
    for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }

    Serial.println(F("The NUID tag is:"));
    Serial.print(F("UID: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
  } else {
    Serial.println(F("Card read previously."));
  }
  // Halt PICC
  rfid.PICC_HaltA();
  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();

  Serial.print(Firebase.getString("UID1") + "\n");
  Serial.print(Firebase.getString("UID2") + "\n");
  Serial.print(Firebase.getString("UID3") + "\n");
  Serial.print(Firebase.getString("UID4") + "\n");
  Serial.print(Firebase.getString("UID5") + "\n");
  Serial.print(Firebase.getString("UID6") + "\n");

  analogWrite(UID1, Firebase.getString("UID1").toInt());
  analogWrite(UID2, Firebase.getString("UID2").toInt());
  analogWrite(UID3, Firebase.getString("UID3").toInt());
  analogWrite(UID4, Firebase.getString("UID4").toInt());
  analogWrite(UID5, Firebase.getString("UID5").toInt());
  analogWrite(UID6, Firebase.getString("UID6").toInt());
  delay(3000);

  if (WiFi.status() != WL_CONNECTED) {
    wifiConnect();
  }
  delay(10);

  if (Firebase.getString("UID1") = rfid.uid.uidByte()) {
    Serial.print("Match")
  }
}

Вот моя ошибка:

fireabse-alpha1: 118: 22: ошибка: несовместимые типы при назначении 'String' to 'byte [10] {aka unsigned char [10]}'

if (rfid.uid.uidByte = Firebase.getString ("UID1")) {
^
fireabse-alpha1: 120: 1: ошибка: ожидается ';' до '}' токен

}
^

1 Ответ

0 голосов
/ 29 мая 2019

Serial.println('\n'); не требуется. Потому что ln в имени означает, что оно напечатает новую строку.

rfid.uid.uidByte - это массив 10 байтов .
Firebase.getString("UID1") возвращает Arduino String

Вы не можете сравнить массив с String. Но вы можете сравнить элементы String с элементами массива.

String handle = Firebase.getString("UID1");
uint8_t lengthToCompare = rfid.uid.size;
if(handle.length() != lengthToCompare){ // this only works if you compare the whole string
    // not equal
}

bool equal = true;
for(int i=0;i<lengthToCompare;++i) {
    equal &= handle.c_str()[i] == rfid.uid.uidByte[i]; // compare if equal and variable 
                                                       // equal remains true if so
}
// equal now holds if the sequences where equal

Как уже было сказано, rfid.uid.uidByte = Firebase.getString("UID1") - это не сравнение, а присвоение, причем плохое, поскольку String присваивается массиву байтов. Оператор сравнения: ==.

Также при публикации в StackOverflow (или работе с вашим кодом): clang-format.exe -i <filename> ваш друг. (конечно, при условии, что вы используете Windows, я не хотел бы предполагать ваши настройки ОС)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...