Ввод и обработка данных из нескольких источников
- Войдите на сайт для отправки комментариев
Всем привет!
Помогите, плиз. Я столкнулся со следующей задачей - нужно обрабатыватть данные получаемые из разных источников: с клавиатуры, из последовательного порта, с флешки. После этого надо из полученных данных соорудить посылку и отправить ее по радиоканалу на оконечное устройство.
Формат данных для начала простой - <"А"><адрес устройства><*><код команды><"#"> (прим.: А1*24#)
"А"- признак начала посылки; "*" - разделитель; "#" символ конца посылки. Адрес устройства и код команды должны быть преобразованы из строки символов в int или unsigned_int, количество знаков в этом поле может быть переменное.
Почитав тут на форуме про разбор строк я понял, что лучше привести все получаемые данные к одному виду, например к строке с параметрами разделенными запятыми.
Вот так: "А"<адрес устройства>,<код команды><признак конца строки> ( прим.: А1,24/r)
Эти странные признаки/разделители - "А", "*", "#" вылезли из ипользования стандартной 16-клавишной клавиатуры 4*4, чтобы оператор не задумываясь набирал команду. А запятые и признак конца строки проще писать в текстовый файл на флешку.
Собственно, вопросы;
Клавиатура определена стандартно:
const byte ROWS = 4; //four rows const byte COLS = 4; //four columns //define the cymbols on the buttons of the keypads char hexaKeys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {A0, A1, A2, A3}; //connect to the row pinouts of the keypad byte colPins[COLS] = {A4, A5, 2, 3}; //connect to the column pinouts of the keypad
По идее, для унификации можно "*" и "#" переопределить как "," и <признак конца строки> - вот какой признак лучше подойдет? И как его правильно записать вместо "#"?
Так? :
const byte ROWS = 4; //four rows const byte COLS = 4; //four columns //define the cymbols on the buttons of the keypads char hexaKeys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {',','0','/r','D'} }; byte rowPins[ROWS] = {A0, A1, A2, A3}; //connect to the row pinouts of the keypad byte colPins[COLS] = {A4, A5, 2, 3}; //connect to the column pinouts of the keypad
Далее - я определяю массив типа char (например не более 15 смволов), считываю туда данные из какого-либо источника и начинаю разгребать. Какой функцией лучше это сделать и как?
Я так понял, сразу можно обработать массив с помощью sscanf(); и на выходе получить сразу два числа типа int. Но тут я туплю в синтаксисе. Или так не получится, и придется дополнительно два полученных массива преобразовать с помощью atoi(); ?
Тогда может быстрее получится обработать строку с помощью parceint(); ? В этом случае, я так понимаю, при приеме данных из последовательного порта можно будет записать:
int adrs; int mode; if(Serial.available()){ char D=Serial.read(); if(D == "A"){ // если полученый символ - признак начала, то while(Serial.available()){ // пока есть данные adrs = Serial.parceInt(); // считываем адрес, до первой запятой mode = Serial.parceInt(); // считываем номер команды, до признака конца строки } } // тут можно в serial вывести то что приняли или сообщение об ошибках // }
А как тогда правильно считывать данные с клавиатуры (а позже и обрабатывать файл)? Точно так-же, но оперировать строкой данных и функцией: String.parceInt ?
Я еще чайник в программировании, поэтому такие вопросы...