Обработка строки из RFID

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Добрый день. Есть RFID считыватель IPR-6 подключенный к Arduino, но он при счытывании кода карточки передает в следующем виде

0 байт -  начало передачи 23h
1-10 байт - номер карточки
11 байт - контрольная сумма
12 байт - 0Dh конец стрки

Как выделить со всего пакета толко 1-10 байты?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Передает какой тип данных? Если строку, то её легко можно обрезать:

String needBytes = stringFromRFIDReader;
needBytes = needBytes.substring(0,10);

 

где needBytes это строка с результатом, а stringFromRFIDReader - строка с данными от рфид читалки

 

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Большое спасибо. Завтра проверю

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Yarik.Yar пишет:

 Если строку, то её легко можно обрезать:

String needBytes = stringFromRFIDReader;
needBytes = needBytes.substring(0,10);

 

где needBytes это строка с результатом, а stringFromRFIDReader - строка с данными от рфид читалки

 

Спасибо, заработало. Но теперь столкнулся с другой проблемой. При повторной отправки данных в порт, он мне возвращает старые даные, к примеру:

первый раз отправляю код первой карты в формате который получаю со счтитывателя @15df15d1vr1 получаю 15df15d1vr. Потом отправляю код второй карты @15fg2df1g8g, а получаю 15df15d1vr.

Как очитить буфер и считать новый код карты?


int i;
char buffer[100];

void setup() {
        Serial.begin(9600); 
}

void loop() {
    if(Serial.available()){
     delay(100);
      
     //загоняем прочитанное в буфер
     while( Serial.available() && i< 99) {
        buffer[i++] = Serial.read();
     }
     //закрываем массив
     buffer[i++]='\0';
  
    String needBytes = buffer;
    needBytes = needBytes.substring(1,11);
    Serial.println(needBytes);
}
}

 

X-Dron
Offline
Зарегистрирован: 24.01.2015

По крайней мере. В начале лучше все-таки инициализировать int i =0;

А после закрытия массива обнулить указатель.

//закрываем массив
buffer[i++]='\0';
i =0;
 

Да и буфер можно сделать покороче, как раз на длинну посылки в 13 байт + \0

MaxShadow
Offline
Зарегистрирован: 13.04.2015

X-Dron пишет:

По крайней мере. В начале лучше все-таки инициализировать int i =0;

А после закрытия массива обнулить указатель.

//закрываем массив
buffer[i++]='\0';
i =0;
 

Да и буфер можно сделать покороче, как раз на длинну посылки в 13 байт + \0

спасибо, заработало. завтра буду подключать считыватель

X-Dron
Offline
Зарегистрирован: 24.01.2015

Попытался оптимизировать под Ваш протокол. Без лишнего буфера.

int i = 0;
String message;
 
void setup() {
   Serial.begin(9600);
}
 
void loop() {
    if(Serial.available()){
      char incomingChar = Serial.read();
      if (incomingChar == 0x23 || incomingChar == '@') {
        i=0; 
        message = "";
      }
      if (incomingChar != 0x0D || i<12) {
          message += incomingChar;
          i++;
      } else {
          message +='\0';
          message = message.substring(1,11);
          Serial.println(message);
      }
   }
}

 

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Спасибо.

Столкнулся еще с одной проблеммой. Для того чтобы считывать карточки на считыватель нужно отправить команду "read card". но считыватель запускается через 2 секунды после запуска ардуины.

Написал так:

void setup() {
        Serial.begin(9600);  //USB порт arduino
        Serial1.begin(2400); //RS232 считыватель
        delay(5000);
        Serial1.println("read card");  //отправка в порт команды считывать карты
        pinMode(3, OUTPUT); //оптопара на открытие
        pinMode(4, OUTPUT); //оптопара на пишалку
}

но не помогло.

Как отправить команду через 5с после включения

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Что мешает Serial1.println("read card"); в начало loop() ставить?

X-Dron
Offline
Зарегистрирован: 24.01.2015

CityCat а смысл?. Нужно послать один раз, а не долбать постоянно.
MaxShadow
Идея правильная, непонятно почему не работает.
Считыватель не посылает в ответ никакого сообщения? типа "Ok"?
 

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Нет не посылает

пока решил так

int a=1;
............
void loop() {
    if(a==1)
      {
        delay(5000);
        Serial1.println("read card");  //отправка в порт команды считывать карты
        a=0;
      }
..............