Как я могу имитировать чтение нескольких считывателей 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
}

1 ответ

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

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

  • создать цикл 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
        } 
    }
    
Другие вопросы по тегам