Как я могу имитировать чтение нескольких считывателей RFID через библиотеку Softwareserial в цикле?

Я работаю над проектом, который требует одновременного считывания с шести RFID-считывателей ID-12LA.

Я пытался настроить показания с шести каналов через плату Sparkfun Analog/Digital MUX Breakout (CD74HC4067), но безуспешно. Я не знаю, поддерживает ли он последовательную связь, хотя я читал об этом на Bildr.org.

Однако сейчас я пытаюсь эмулировать чтение из нескольких последовательных портов через библиотеку SoftwareSerial. Я читал, что он не может одновременно читать, но, возможно, цикл может имитировать одновременное прослушивание. Я попытался сделать это, прослушав первый серийный номер, затем инициализировав readTag(), а затем, после завершения этой функции, начал прослушивать второй сериал, а затем инициализировал вторую функцию.

Функция readTag() способна считывать сама по себе, когда подключен только считыватель RFID, так что это не проблема.

Ниже приведен код.

Каким будет правильный способ имитировать одновременное чтение с помощью функции цикла?

void setup() {
  Serial.begin(9600);
  ourSerial1.begin(9600);
  ourSerial2.begin(9600);

  pinMode(RFIDResetPin, OUTPUT);
  digitalWrite(RFIDResetPin, HIGH);
}

void loop() {

  ourSerial1.listen();
  readTag1();
  ourSerial2.listen(); 
  readTag2(); // Only this function works right now, because it is the last serial that was initiated in setup.

}

void readTag1() {

  char tagString[13];
  int index = 0;
  boolean reading = false;

  while (ourSerial1.available()) {

    int readByte = ourSerial1.read();

    if (readByte == 2) reading = true; // Beginning of tag
    if (readByte == 3) reading = false; // End of tag

    if (reading && readByte != 2 && readByte != 10 && readByte != 13) {
      //store the tag
      tagString[index] = readByte;
      index ++;
    }
  }

  checkTag(tagString); // Check if it is a match
  clearTag(tagString); // Clear the char of all value
  resetReader(); // Reset the RFID reader
}

void readTag2() {

  char tagString[13];
  int index = 0;
  boolean reading = false;

  while (ourSerial2.available()) {

    int readByte = ourSerial2.read();

    if (readByte == 2) reading = true; // Beginning of tag
    if (readByte == 3) reading = false; // End of tag

    if (reading && readByte != 2 && readByte != 10 && readByte != 13) {
      //store the tag
      tagString[index] = readByte;
      index ++;
    }
  }

  checkTag2(tagString); // Check if it is a match
  clearTag(tagString); // Clear the char of all value
  resetReader(); // Reset the RFID reader
}

person carolinesabas    schedule 05.06.2017    source источник


Ответы (1)


Я прав, что вы просто хотите имитировать/имитировать связь с RFID? Вы хотите иметь одновременное считывание с 2-6 последовательных считывателей RFID?

Что вам следует делать, так это не использовать функцию ourSerial1.listen(); рутина. Это действительно не может прослушивать 2 порта одновременно. Создайте свои собственные подпрограммы, которые опрашивают отдельные порты (при необходимости переключите свой мультиплексор между ними):

  • создайте цикл for, который проверяет xx раз (в зависимости от вашей настройки, в течение 100 мс?)

    for (int i = 0, i < 1000, i++) //first part of loop
    {
        if (Serial.available())
        {
          // do your decoding of port 1 here
        } 
    }
    for (int i = 0, i < 1000, i++) //second part of loop
    {
        if (Serial1.available()) //other port
        {
          // do your decoding of port 1 here
        } 
    }
    
person Thomas De Gussem    schedule 08.06.2017