Как лучше написать?
- Войдите на сайт для отправки комментариев
Ср, 23/12/2015 - 16:56
Ввиду того, что языки программирования я не знаю вообще, возник такой вопрос: каким способом лучше (И ПОЧЕМУ?) считывать данные с жсм-модема: предварительно создать буфер типа
unsigned char buffer[64]; // buffer array for data recieve over serial port int count=0; // counter for buffer array void setup() { GPRS.begin(19200); // the GPRS baud rate Serial.begin(19200); // the Serial port of Arduino baud rate. } void loop() { if (GPRS.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield { while(GPRS.available()) // reading data into char array { buffer[count++]=GPRS.read(); // writing data into array if(count == 64)break; } ....... ну и т.д.
или же таким:
void setup() { GPRS.begin(19200); Serial.begin(19200); } void loop() { if (GPRS.available()) { String message=""; while(GPRS.available()) { char ch=GPRS.read(); message+=ch; } ... и затем парсим строку
Куда считывать, в буфер или в строку (которая по сути тоже буфер) - разницы нет.
Разница лишь в том, что в первом примере то, куда мы считываем, является глобальной переменной, а во втором - локальной. Вот тут и нужно разобраться, что мы в дальнейшем с этм буфером/строкой собираемся делать.
Собственно, на форуме сейчас обсуждется тема по сравнению глобальных переменных и локальных.
второй пример - не рабочий, как понимаю. Локал объявлен как пустая строка, то есть длина как буфера = 1 символ (конец строки). При добавлении в него символов - будем "тереть" стек. Нет, я не прав?
Первый пример "подавится" по заполнению буфера и требует предварительного выделения памяти под него. Если передача символов не закончится после 64-го, то цикл вывалится и принимать далее перестанет, "всё нажитое непосильным трудом" будет утеряно, пока идет обработка.
Правильнее, если "скорость позволяет" - принимать и обрабатывать "посимвольно". Приняли байтик - "съели", принимаем следующий. Или ваще, обрабатывать по прерываниям. Прием - прерывание, буферизация, сообщение передатчику "буфер заканчивается - заткнись". В общем виде - правильного решения нет. Всё зависит от длины передачи, её скорости, возможности слейву управлять скоростью и т.д. Чем больше "известных" параметров - тем проще найти "верное" решение. Короче, от задачи плясать надо.
второй пример - не рабочий, как понимаю. Локал объявлен как пустая строка, то есть длина как буфера = 1 символ (конец строки). При добавлении в него символов - будем "тереть" стек. Нет, я не прав?
Первый пример "подавится" по заполнению буфера и требует предварительного выделения памяти под него. Если передача символов не закончится после 64-го, то цикл вывалится и принимать далее перестанет, "всё нажитое непосильным трудом" будет утеряно, пока идет обработка.
Правильнее, если "скорость позволяет" - принимать и обрабатывать "посимвольно". Приняли байтик - "съели", принимаем следующий. Или ваще, обрабатывать по прерываниям. Прием - прерывание, буферизация, сообщение передатчику "буфер заканчивается - заткнись". В общем виде - правильного решения нет. Всё зависит от длины передачи, её скорости, возможности слейву управлять скоростью и т.д. Чем больше "известных" параметров - тем проще найти "верное" решение. Короче, от задачи плясать надо.
На самом деле второй пример вполне рабочий и им как раз пользуюсь в данный момент, но вот про "тереть стэк" ничего не могу сказать...Наверное потому, что принимаемый объем не так велик, чтобы затереть стэк (да и вообще как это определить?)... Мне, как полному "нубу" в Си, проще использовать String и парсить с помощью indexOf() ибо легче в освоении для новичков еще ничего не нашел, а тут увидел разные примеры и в связи с этим возникла эта тема. Посимвольный парсинг всех моих смсочных "хотелок", как мне кажется, сделает код гораздо больше в плане писанины... А в плане задачи... Так она проста - парсить все входящее в Sim900