Есть скетч, считывающий RFID метки : Код (Text): // link between the computer and the SoftSerial Shield //at 9600 bps 8-N-1 //Computer is connected to Hardware UART //SoftSerial Shield is connected to the Software UART:D2&D3 #include <SoftwareSerial.h> SoftwareSerial SoftSerial(2, 3); unsigned char buffer[64]; // buffer array for data recieve over serial port int count=0; // counter for buffer array void setup() { SoftSerial.begin(9600); // the SoftSerial baud rate Serial.begin(9600); // the Serial port of Arduino baud rate. } void loop() { if (SoftSerial.available()) // if date is comming from softwareserial port ==> data is comming from SoftSerial shield { while(SoftSerial.available()) // reading data into char array { buffer[count++]=SoftSerial.read(); // writing data into array if(count == 64)break; } Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook SoftSerial.write(Serial.read()); // write it to the SoftSerial shield } void clearBufferArray() // function to clear buffer array { for (int i=0; i<count;i++) { buffer[i]=NULL;} // clear all index of array with command NULL } Выдает на выходе 638746834DA3. Как сравнить эту строку с эталоном? Если совпадает, то одно условие,, если не совпадает, то другое.
Я предположил и сделал так : в начале вписал эталонную строку: Код (Text): unsigned char buffer2[64] = {'8','7','5','8','8','6','D','F','5','8','8','6'}; А в теле поставил условие : Код (Text): void loop() { if (SoftSerial.available()) // if date is comming from softwareserial port ==> data is comming from SoftSerial shield { while(SoftSerial.available()) // reading data into char array { buffer[count++]=SoftSerial.read(); // writing data into array if(count == 64) break; if (buffer[count]==buffer2[count]) {Serial.print('OK');} else {Serial.print('WRONG');} Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook SoftSerial.write(Serial.read()); // write it to the SoftSerial shield } } В результате получил : WRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGWRONGOKOKOK "ОК" напечатал на месте НЕдостающийх символов в эталонной строке. Если эталонная строка выглядит : Код (Text): unsigned char buffer2[64] = {}; то выдает : OKOKOKOKOKOKOKOKOKOKOKOKOK
Код (Text): void loop() { if (SoftSerial.available()) // if date is comming from softwareserial port ==> data is comming from SoftSerial shield { while(SoftSerial.available()) // reading data into char array { buffer[count++]=SoftSerial.read(); // writing data into array if (buffer[count]==buffer2[count]) {Serial.print('OK');} else {Serial.print('WRONG');} if(count == 64) break; Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook SoftSerial.write(Serial.read()); // write it to the SoftSerial shield } } Надо так? Или еще раньше? Может нужен какой-то завершающий символ типа "\0" типа : Код (Text): unsigned char buffer2[64] = {'8','7','5','8','8','6','D','F','5','8','8','6','\0'};
Нет. Зачем вы count++ делаете сразу после чтения из порта? У вас же сравниваются после этого еще не принятые значения! Переносите инкремент в конец цикла.
Прошу прощения, потерял скобку : Код (Text): void loop() { if (SoftSerial.available()) // if date is comming from softwareserial port ==> data is comming from SoftSerial shield { while(SoftSerial.available()) // reading data into char array { buffer[count++]=SoftSerial.read(); // writing data into array if (buffer[count]==buffer2[count]) {Serial.print('OK');} else {Serial.print('WRONG');} if(count == 64) break; } Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook SoftSerial.write(Serial.read()); // write it to the SoftSerial shield } Вот так у меня написан код.
Код (Text): void loop() { if (SoftSerial.available()) // if date is comming from softwareserial port ==> data is comming from SoftSerial shield { while(SoftSerial.available()) // reading data into char array { buffer[count]=SoftSerial.read(); // writing data into array if (buffer[count]==buffer2[count]) {Serial.print('OK');} else {Serial.print('WRONG');} if(count == 64) break; count++; } Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook SoftSerial.write(Serial.read()); // write it to the SoftSerial shield }
Все отлично проверяет! Выяснил что с RFID первый байт считывается входной, а последний закрывающий...в результате следует сравнивать со строкой: Код (Text): unsigned char buffer1[64] = {'1','7','1','0','0','8','6','3','B','5','5','9','9','1'}; где первый и последний символы никогда не совпадают с прикладываемой картой...поэтому для утверждения идентичности номера достаточно зафиксировать 12 совпадений. (между эталонной строкой и считанной с устройства)
Просто супер! Спасибо вам большое, думал сойду с ума с этим сканером) сам бы точно не допер до этого прикола с первым и последним байтом.