Ввод и обработка данных из нескольких источников

Нет ответов
DiSer
Offline
Зарегистрирован: 14.02.2014

Всем привет!

Помогите, плиз. Я столкнулся со следующей задачей - нужно обрабатыватть  данные получаемые из разных источников: с клавиатуры, из последовательного порта, с флешки. После этого надо из полученных данных соорудить посылку и отправить ее по радиоканалу на оконечное устройство.

Формат данных для начала простой - <"А"><адрес устройства><*><код команды><"#">  (прим.: А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 ?

Я еще чайник в программировании, поэтому такие вопросы...