Время из GPRS шилд

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

  1. MDV

    MDV Гик

    Коллеги, доброго дня.
    Есть ли у кого ни буди рабочий пример как вытащить из девайса время.
    В библиотеке что на сайте функция вроде есть,
    Код (C++):
    bool GPRS::getDateTime(char *buffer)
    но запустить не получилось.
     
  2. shpock

    shpock Гик

    на модуле с SIM5216 с помощью АТ команд вот так:

    AT+CCLK=”16/02/14, 12:30:33+03” - установка

    AT+CCLK? - запрос

    скорее всего и у вас заработает
     
  3. MDV

    MDV Гик

    Как с помощью АТ команд это сделать я знаю. Мне необходимо в скетче поучить время от модема.
     
  4. shpock

    shpock Гик

    Код (C++):
    Serial.print("AT+CCLK?");
    Serial.print(13,BYTE);
    delay(1000);
         if (Serial.available()>0)
             {
             int i = 0;
             while (Serial.available()>0){
             gtime[i]=(Serial.read());
             i++;
             }
    в gtime будет ваше время дата
     
  5. MDV

    MDV Гик

    Спасибо. Буду пробовать.
    Но хочется запустить библиотечную функцию.
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Чтобы усложнить код увеличить размер НЕХ и уменьшить его быстродействие?
     
  7. Unixon

    Unixon Оракул Модератор

    С чего бы это? Неиспользуемый код компилятор удалит при оптимизации.
     
  8. shpock

    shpock Гик

    да это и есть кусок библиотеки
     
  9. MDV

    MDV Гик

    Коллеги продолжая тему.
    мучил библиотеку но вернулся к началу:
    Код (C++):
    bool GPRS::getDateTime(char *gtime)
    {
      //AT+CCLK?                        --> 8 + CRLF = 10
      //+CCLK: "14/11/13,21:14:41+04"   --> 29+ CRLF = 31
      //                                --> CRLF     =  2
      //OK

        byte i = 0;
        char gprsBuffer[46];
        char *p,*s;
        sim900_send_cmd("AT+CCLK?\r\n");
        sim900_clean_buffer(gprsBuffer,43);
        sim900_read_buffer(gprsBuffer,43,DEFAULT_TIMEOUT);
        if(NULL != ( s = strstr(gprsBuffer,"+CCLK:"))) {
            s = strstr((char *)(s),"\"");
            s = s + 1;  //We are in the first phone number character
            p = strstr((char *)(s),"\""); //p is last character """
            if (NULL != s) {
                i = 0;
                while (s < p) {
                  gtime[i++] = *(s++);

                }
                gtime[i] = '\0';          
            }
            //We are going to flush serial data until OK is recieved
             return sim900_wait_for_resp("OK\r\n", CMD);
        }
        return false;
    }
    теперь на запрос времени выдает или 0 или 1 но мне нужно само время. Пробовал убрать ретурн и вывести буфер, информацию выводит, но не стабильно, ощущение, что буфер не очищается и через пару запросов в порт шлется сплошная ересь.
    Посоветуйте что поправить.
     
  10. sensor

    sensor Нуб

    Функцию вызывай правильно.
    Сама функция вернет true/false в зависимости от того, удалось получить время или нет.
    При вызове типа res = getDateTime(gtime) значение времени вернется в параметре gtime.
     
    znamen и shpock нравится это.
  11. MDV

    MDV Гик

    Всем доброго дня.
    Мучаю свой модем, спасибо тем кто откликнулся, теперь время достаю из модема и отправляю в сериал, но возникла проблема, как только что то со строкой начинаешь делать сразу облом, в сериал время перестает выводиться.
    код в приложении, свои комменты дописал, но нужен совет правильно ли я понимаю.
    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    #include <SoftwareSerial.h>
    GPRS gprs (9, 10, 38400);
    void setup()
    {
      gprs.powerUpDown();
      Serial.begin(38400);
      while (!Serial) {
      }
      while (!gprs.init()) {
        delay(1000);
        Serial.print("Init error\r\n");
      }
      Serial.println("GPRS init success");
    }
    void loop()
    {
      byte i = 0;
      char gprsBuffer[46];
      char *p, *s;
      sim900_send_cmd("AT+CCLK?\r\n"); // отправяем в модем АТ команду запроса времени
      sim900_clean_buffer(gprsBuffer, 43); // чистим буфер
      sim900_read_buffer(gprsBuffer, 43, DEFAULT_TIMEOUT); // читаем из буфера первые 43 байта, по прошествии некоторого времени идем дальше
      if (NULL != ( s = strstr(gprsBuffer, "+CCLK:"))) // если в том, что прочитали есть ответ модема "+CCLK:" обрабатываем, иначе ждем 0,5 сек и все повторям
      {
        s = strstr((char *)(s), "\""); // начинаем разбор после нахождения в буфере символоа "
        s = s + 1;  // перебор строки
        p = strstr((char *)(s), "\""); //ловим последнюю кавычку
        if (NULL != s) // если в s что то есть, пишем это в массив gprsBuffer
        {
          i = 0;
          while (s < p) //
          {
            gprsBuffer[i++] = *(s++); //
          }
          gprsBuffer[i] = '\0'; //добавляем символ окончания строки
        }
        sim900_wait_for_resp("OK\r\n", CMD); //ждем Ок
        Serial.println (gprsBuffer); // отправляем в порт поученное из модема время
      }
      delay (500);
    }
    По замыслу, необходимо извлечь время из модема, вычислить день недели и исходя из дня недели выполнить некий алгоритм. Застрял на том, что как только я присваиваю какой нибудь переменной значение из gprsBuffer в сериал время уже не шлется.
     
  12. KoKaiN

    KoKaiN Нерд

    Как извлечь время из GPRS шилда понятно, понятно как его установить - AT+CCLK спасает.
    А как заставить модем синхронизоваться с оператором?
    Есть AT команда AT+CTZU (AT command enable/disable automatic timezone update on the device)
    Но GPRS Shield v2 (SIM800) ее не понимает.
    Искал ее в списке AT команд SIM800 - нет (http://wiki.amperka.ru/_media/продукты:arduino-gprs-shield-v3:sim800_at_commands.pdf)
    Думал, может появилась позднее - поискал в списке ATкоманд SIM900 - тоже нет
    (https://www.espruino.com/datasheets/SIM900_AT.pdf)
    Как на GPRS правильное время завести?
     
  13. KoKaiN

    KoKaiN Нерд

  14. b707

    b707 Гуру

    Заработало - повезло. В основном это зависит от оператора связи. У кого-то время отдается, у кого-то нет. В Мск, к примеру, время по команде AT+CCLK у меня возвращал только Билайн.
     
  15. KoKaiN

    KoKaiN Нерд

    МТС отдал. Тоже в мск.
    Не объясните мне (не очень я в этом вопросе)? Команда AT+CCLK пролетает до оператора? Я почему-то думал что эта команда обрабатывается устройством и отдает текущее время на плате.
     
  16. b707

    b707 Гуру

    Пардон, не совсем точно выразился.
    Вы правы, AT+CCLK выдает текущее время устройства и эта команда работает. конечно же, независмо от оператора.
    Имел в виду. что по команде AT+CLTS=1 синхронизация времени с сетью у меня работала только в билайне.
     
    KoKaiN нравится это.
  17. KoKaiN

    KoKaiN Нерд

    Понял, спасибо!