Читаем данные с SIM800 функция

Тема в разделе "Arduino & Shields", создана пользователем Baks, 11 мар 2016.

  1. Baks

    Baks Нуб

    Доброго всем времени суток, хочу написать функцию которая будет читать все ответы от модуля SIM800 и возвращать то что прочитано но немного застрял.

    Первая идея была считать все в переменную типа String. все получилось но полазив по форуму почитал и решил его не использовать

    вот написал такую функцию

    Код (C++):
    char readSIM (){
     
    char buffer[100];
    int i = 0;

      if (Serial.available()) {
        delay(100);
        //загоняем прочитанное в буфер
        while ( Serial.available() && i < 99) {
          buffer[i++] = Serial.read();
        }
        //закрываем массив
        buffer[i++] = '\0';
       return buffer;
      }
    }// end readSIM
    IDE выдает ошибку (In function 'char readSIM()': ... error: invalid conversion from 'char*' to 'char' [-fpermissive]) конечно можно вывести переменную как глобальную но снова не очень хороший тон программирования а хочется красиво , для себя ведь.

    как можно передать string (char) из функции
     
  2. Sindbad

    Sindbad Гик

    Код (C++):
    char* readSIM (){
    Только так делать нельзя. Вы вернете ссылку на строку, которая существует только внутри функции.

    Поэтому да, нужно объявлять строку глобально, при вызове функции передавать адрес массива как параметр.
     
  3. stasych

    stasych Нерд

    В целях повышения быстродействия delay можно уменьшить до 20.
     
  4. fogary

    fogary Гик

    Не пугайте людей, так делать как раз можно.
     
  5. stasych

    stasych Нерд

    У меня несколько вопросов:
    Что за спецсимволы /r и /n ?
    Как отделить само сообщение от служебной инфы в смс. Всегда ли первая строка одинаковой длины?
    Пробую делать так:
    Код (C++):
    void loop() {

      while (Serial2.available()) {
        delay(20);
        currSymb = Serial2.read();
        if ('\r' == currSymb) Serial.println("**");
        if ('\n' == currSymb) Serial.println("%%");
        currStr = currStr + String(currSymb);
                                  }
        if (currStr != "")  {
          Serial.println(currStr);
          currStr = "";
                            }
                    }
    Отображается так:

    **
    %%
    **
    %%
    **
    %%

    +CMT: "+79151536972","","16/10/20,16:11:26+12"
    gjmptw€

    И еще самый последний символ. Он то есть то нет. Что он такое?
     
    Последнее редактирование: 20 окт 2016
  6. obuhanoe

    obuhanoe Гик

    У себя на SIM800L тоже заметил в последнее время - если в СМС содержится маленькая w - идет следом знак евро, если не ошибаюсь.
    Раньше у меня такого не было, оператор Мегафон-Кавказ.
     
  7. fogary

    fogary Гик

    Первый - перевод каретки (курсора) в начало строки; второй - переход на новую строку (вниз). Все вместе - переводит курсор в начало новой строки.
     
  8. stasych

    stasych Нерд

    Получается для облегчения себе жизни нужно исключить в смс символа w.
    А как отловить конец первой строки смс?
     
  9. stasych

    stasych Нерд

    У меня тоже мегафон.
     
  10. obuhanoe

    obuhanoe Гик

    ну да, я решил использовать заглавную.
     
  11. stasych

    stasych Нерд

    В итоге смс принимаю так:
    Код (C++):
    char currSymb;
    String currStr, message;
    int i;

    void setup() {
      Serial.begin(19200);
      Serial2.begin(19200);
      currStr = "";
      message = "";
                 }

    void loop() {

      while (Serial2.available()) {
        delay(20);
        currSymb = Serial2.read();
        currStr = currStr + String(currSymb);
                                  }
        if (currStr != "")  {
          i = currStr.length();
          for (i = 50; i < (currStr.length()-2); i++)
                                       message += currStr.charAt(i);
          currStr = "";
          Serial.print(message);
                            }
                    }
    текст смски находится в переменной message.
    Правда это все верно при условии постоянной длины первой строки смс. Но как я заметил, если например время 4 минуты то в смске отображается 04 минуты, и с секундами, часами также. Так что должно работать нормально.
    Пока что обкатываю.
     
  12. fogary

    fogary Гик

    Для чего Вам первая (из приведенных) строка?
    Поясню. В первой строке, значение переменной "i" будет равно длине строки "currStr", а во второй, этой же переменной Вы присваиваете значение 50.
     
  13. stasych

    stasych Нерд

    Да точно ! Первая строка не нужна.
    Не до конца вычистил код после экспериментов.