Коллеги, доброго дня. Есть ли у кого ни буди рабочий пример как вытащить из девайса время. В библиотеке что на сайте функция вроде есть, Код (C++): bool GPRS::getDateTime(char *buffer) но запустить не получилось.
на модуле с SIM5216 с помощью АТ команд вот так: AT+CCLK=”16/02/14, 12:30:33+03” - установка AT+CCLK? - запрос скорее всего и у вас заработает
Код (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 будет ваше время дата
Коллеги продолжая тему. мучил библиотеку но вернулся к началу: Код (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 но мне нужно само время. Пробовал убрать ретурн и вывести буфер, информацию выводит, но не стабильно, ощущение, что буфер не очищается и через пару запросов в порт шлется сплошная ересь. Посоветуйте что поправить.
Функцию вызывай правильно. Сама функция вернет true/false в зависимости от того, удалось получить время или нет. При вызове типа res = getDateTime(gtime) значение времени вернется в параметре gtime.
Всем доброго дня. Мучаю свой модем, спасибо тем кто откликнулся, теперь время достаю из модема и отправляю в сериал, но возникла проблема, как только что то со строкой начинаешь делать сразу облом, в сериал время перестает выводиться. код в приложении, свои комменты дописал, но нужен совет правильно ли я понимаю. Код (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 в сериал время уже не шлется.
Как извлечь время из 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 правильное время завести?
Затупил с утра. Нашел такой мануал: https://www.raviyp.com/embedded/244-gsm-network-time-synchronization-for-rtc-using-at-clts-command Procedure : Read current time (You can see that the time is not right): AT+CCLK? Enable auto network time sync : AT+CLTS=1 Save the setting to permanent memory so that module enables sync on restart also : AT&W OK Restart Вот рестарт то я как раз не делал. Все заработало
Заработало - повезло. В основном это зависит от оператора связи. У кого-то время отдается, у кого-то нет. В Мск, к примеру, время по команде AT+CCLK у меня возвращал только Билайн.
МТС отдал. Тоже в мск. Не объясните мне (не очень я в этом вопросе)? Команда AT+CCLK пролетает до оператора? Я почему-то думал что эта команда обрабатывается устройством и отдает текущее время на плате.
Пардон, не совсем точно выразился. Вы правы, AT+CCLK выдает текущее время устройства и эта команда работает. конечно же, независмо от оператора. Имел в виду. что по команде AT+CLTS=1 синхронизация времени с сетью у меня работала только в билайне.