Обработка строки из RFID
- Войдите на сайт для отправки комментариев
Пнд, 13/04/2015 - 13:05
Добрый день. Есть RFID считыватель IPR-6 подключенный к Arduino, но он при счытывании кода карточки передает в следующем виде
0 байт - начало передачи 23h
1-10 байт - номер карточки
11 байт - контрольная сумма
12 байт - 0Dh конец стрки
Как выделить со всего пакета толко 1-10 байты?
Передает какой тип данных? Если строку, то её легко можно обрезать:
где needBytes это строка с результатом, а stringFromRFIDReader - строка с данными от рфид читалки
Большое спасибо. Завтра проверю
Если строку, то её легко можно обрезать:
где 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); } }По крайней мере. В начале лучше все-таки инициализировать int i =0;
А после закрытия массива обнулить указатель.
//закрываем массив
buffer[i++]='\0';
i =0;
Да и буфер можно сделать покороче, как раз на длинну посылки в 13 байт + \0
По крайней мере. В начале лучше все-таки инициализировать int i =0;
А после закрытия массива обнулить указатель.
//закрываем массив
buffer[i++]='\0';
i =0;
Да и буфер можно сделать покороче, как раз на длинну посылки в 13 байт + \0
спасибо, заработало. завтра буду подключать считыватель
Попытался оптимизировать под Ваш протокол. Без лишнего буфера.
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); } } }Спасибо.
Столкнулся еще с одной проблеммой. Для того чтобы считывать карточки на считыватель нужно отправить команду "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с после включения
Что мешает
Serial1.println("read card"); в начало loop() ставить?CityCat а смысл?. Нужно послать один раз, а не долбать постоянно.
MaxShadow
Идея правильная, непонятно почему не работает.
Считыватель не посылает в ответ никакого сообщения? типа "Ok"?
Нет не посылает
пока решил так
int a=1; ............ void loop() { if(a==1) { delay(5000); Serial1.println("read card"); //отправка в порт команды считывать карты a=0; } ..............