Ввод и обработка данных из нескольких источников
- Войдите на сайт для отправки комментариев
Всем привет!
Помогите, плиз. Я столкнулся со следующей задачей - нужно обрабатыватть данные получаемые из разных источников: с клавиатуры, из последовательного порта, с флешки. После этого надо из полученных данных соорудить посылку и отправить ее по радиоканалу на оконечное устройство.
Формат данных для начала простой - <"А"><адрес устройства><*><код команды><"#"> (прим.: А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 ?
Я еще чайник в программировании, поэтому такие вопросы...