Как лучше написать?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Ввиду того, что языки программирования я не знаю вообще, возник такой вопрос: каким способом лучше (И ПОЧЕМУ?) считывать данные с жсм-модема: предварительно создать буфер типа


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;
    
  }
...  и затем парсим строку

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Куда считывать, в буфер или в строку (которая по сути тоже буфер) - разницы нет.

Разница лишь в том, что в первом примере то, куда мы считываем, является глобальной переменной, а во втором - локальной. Вот тут и нужно разобраться, что мы в дальнейшем с этм буфером/строкой собираемся делать.

Собственно, на форуме сейчас обсуждется тема по сравнению глобальных переменных и локальных.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

второй пример - не рабочий, как понимаю. Локал объявлен как пустая строка, то есть длина как буфера = 1 символ (конец строки). При добавлении в него символов - будем "тереть" стек. Нет, я не прав?

Первый пример "подавится" по заполнению буфера и требует предварительного выделения памяти под него. Если передача символов не закончится после 64-го, то цикл вывалится и принимать далее перестанет, "всё нажитое непосильным трудом" будет утеряно, пока идет обработка.

Правильнее, если "скорость позволяет" - принимать и обрабатывать "посимвольно". Приняли байтик - "съели", принимаем следующий. Или ваще, обрабатывать по прерываниям. Прием - прерывание, буферизация, сообщение передатчику "буфер заканчивается - заткнись". В общем виде - правильного решения нет. Всё зависит от длины передачи, её скорости, возможности слейву управлять скоростью и т.д. Чем больше "известных" параметров - тем проще найти "верное" решение. Короче, от задачи плясать надо.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Arhat109-2 пишет:

второй пример - не рабочий, как понимаю. Локал объявлен как пустая строка, то есть длина как буфера = 1 символ (конец строки). При добавлении в него символов - будем "тереть" стек. Нет, я не прав?

Первый пример "подавится" по заполнению буфера и требует предварительного выделения памяти под него. Если передача символов не закончится после 64-го, то цикл вывалится и принимать далее перестанет, "всё нажитое непосильным трудом" будет утеряно, пока идет обработка.

Правильнее, если "скорость позволяет" - принимать и обрабатывать "посимвольно". Приняли байтик - "съели", принимаем следующий. Или ваще, обрабатывать по прерываниям. Прием - прерывание, буферизация, сообщение передатчику "буфер заканчивается - заткнись". В общем виде - правильного решения нет. Всё зависит от длины передачи, её скорости, возможности слейву управлять скоростью и т.д. Чем больше "известных" параметров - тем проще найти "верное" решение. Короче, от задачи плясать надо.

На самом деле второй пример вполне рабочий и им как раз пользуюсь в данный момент, но вот про "тереть стэк" ничего не могу сказать...Наверное потому, что принимаемый объем не так велик, чтобы затереть стэк (да и вообще как это определить?)... Мне, как полному "нубу" в Си, проще использовать String и парсить с помощью indexOf() ибо легче в освоении для новичков еще ничего не нашел, а тут увидел разные примеры и в связи с этим возникла эта тема. Посимвольный парсинг всех моих смсочных "хотелок", как мне кажется, сделает код гораздо больше в плане писанины... А в плане задачи... Так она проста - парсить все входящее в Sim900