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