Официальный сайт компании Arduino по адресу arduino.cc
Баланс GSM модуля
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Здравствуйте. Делаю GSM сигнализацию, необходимо знать баланс на сим карте GSM модуля. Хочу сделать так, чтобы по запросу с мобильного (смс) в ответ приходило сообщение о балансе от GSM модуля. Для запроса баланса использую команду ATD*101#. Если набирать команду в Serial monitor, получаю ответ вида:
OK
+CUSD: 0,"65.12 UAH. Tarif - 'Super MTS 3D Nol'. *Bezlimit na 31.12. - 5 grn. pri popolnenii s 25.11. ot 9 grn. Otkaz - *111#"6
Не могу понять, как эти 65.12 запихнуть в переменную. Пробую библиотеку GSMSHIELD.
На этом скетче пробую отладить:
#include "SIM900.h" #include <SoftwareSerial.h> //#include "sms.h" //SMSGSM sms; //int numdata; boolean started=false; //char smsbuffer[160]; //char n[20]; void balance () { gsm.SimpleWriteln("ATD*101#"); delay(300); } void setup() { Serial.begin(9600); Serial.println("GSM Shield testing."); if (gsm.begin(9600)){ Serial.println("\nstatus=READY"); started=true; } else Serial.println("\nstatus=IDLE"); if(started){ balance(); if(gsm.IsStringReceived("+CUSD:")) { Serial.print("All OK"); } else Serial.print("NO OK"); } }; void loop() { };
Если стоит if(gsm.IsStringReceived("+CUSD:")) { то в сериал мониторе -
GSM Shield testing.
status=READY
NO OK
Если стоит if(gsm.IsStringReceived("OK")) { то в сериал мониторе -
GSM Shield testing.
status=READY
All OK
Я понимаю, что команда ATD*101# возвращает в сериал монитор 2 строки - "ОК" и +CUSD: 0,"65.12 UAH. Tarif - 'Super MTS 3D Nol'. *Bezlimit na 31.12. - 5 grn. pri popolnenii s 25.11. ot 9 grn. Otkaz - *111#"6
Но не знаю как работать со второй строкой. Помогите разобраться.
Неужели никто не знает?
ответ всегда начинается с суммы баланса?
Если да, то это чуть упрощает процесс. В целом идеология такая: выделяем из пришедшего ответа первые 7 символов (один из вариантов), ищем в полученной подстроке точку (определяем номер позиции этой точки), отбрасываем все, что после "позиция точки + 2" (это если нужны копейки), преобразуем в число.
Если набирать команду ATD*101# в Serial monitor, получаю ответ вида:
OK
+CUSD: 0,"65.12 UAH. Tarif - 'Super MTS 3D Nol'. *Bezlimit na 31.12............
Я в принципе смогу поработать со строкой и выделить нужные символы, у меня не получается эту строку записать в строковую переменную.
Вот Serial.print(currStr); // печатаем эту строку - что-то не печатает.... Если бы мне удалось получить эту строку currStr, и проблем бы небыло.
удалить сообщение - глюк в броузере
удалить сообщение - глюк в броузере
удалить сообщение - глюк в броузере
Выкиньте всю логику начиная с 46 строки и просто выводите всё, что получили в Serial. А уж потом будете наворачивать логику, которая не факт, что правильная.
К тому же с таким форматированием текста очень легко ошибиться. Ctrl-T нажимайте прежде чем сюда текст выкладывать. Только не нужно объяснять, просто примите это как совет.
можно ведь зайти на сайте оператора в личный кабинет и глазами посмотреть, сколько осталось, так ведь проще.
или это неспортивно? :)
Не вникая в тонкости с работой gsm модуля ,накидал буквально за 5 минут:
А..тут как со строками работа ,тогда не подойдет или надо переделывать
На сайте оператора можно, но я планирую сделать приложение на андроид и параметры от сигнализации будут передаваться на смартфон+управление будет со смартфона, и информация о балансе на GSM сигнализации будет передаваться в эту программу.
Проблема не с работой со строками, а в том, что не могу эту строку в строковую переменную загнать. Сейчас анализирую логику начиная с 46 строки, похоже там ошибка...
Опять глюк броузера, можно удалить это сообщение. Сам не знаю как удалить.
Все, решил проблему! Спасибо всем, кто откликнулся!
можно поделиться.
можно поделиться.
тест
Может кому пригодится:
Не подскажите как переделать под такой ответ с модема:
Тоесть как выделить в новую переменную "text sms" ?
Подскажу.
Всем привет! смотрю код и понять не могу - где происходит инициализация модуля для работы с библиотекой sim900.h? У меня мега2560, GSM модуль зацеплен к порту Serial1. Хочу использовать функции библиотеки Sim900.h, но в примерах инициализируется софтварный сералпорт... а как хардварный использовать и передать его в инициализацию в эту библиотеку?
код библиотеки:
Вроде функций то тут мало, реализовано главное - ожидание ответа в нужном формате... Каким образом цепануть библиотеку правильно в свой код?
Здравствуйте
Подскажите, кто знает, в чем может быть проблема:
Запрос баланса по кодовому слову BAL уходит, ответ в терминале видно в такой форме :
в библиотеке
SoftwareSerial.h
надо увеличить объем буфераесли читать СМС с задержкой по 100 мс после КАЖДОГО символа (строка 74) - никакой буфер не поможет. Правильнее было бы выкинуть задержки в строках 69 и 74
SHA_MAN - у вас код написан в худших традициях работы с GSM. Вместо того, чтоб после отсылки команд проверять ответы модема - вы напихали в код задержек. Точнее, даже не вы. а автор скетча. так как вы этот код наверняка не писали сами, а нашли в инете. Этот код устойчиво работать не будет.
Спасибо за ответы. Это действительно мои первые шаги с ардуино и я свои "поделки" из кусочков найденных в сети скетчей пробую создавать. Глубоких знаний катастрофически нехватает, но каждый такой "глюк" заставляет копнуть и разобраться.
Я буду благодарен на направление на путь истинный в организации работы моего модема, ибо вся задумка вертится вокруг работы с смс.
в библиотеке
SoftwareSerial.h
надо увеличить объем буфераБлагодарю!!! Помогло
в библиотеке
SoftwareSerial.h
надо увеличить объем буфераБлагодарю!!! Помогло
задержки все равно лучше выкинуть, по меньшей мере в строке 74.
Увеличкение буфера - это "костыль". Памяти в МК мало и особо большим буфер не сделать. Рано или поздно все равно придет пакет, превышающий размер буфера и снова будет обрезан. А при правильной работе с Сериал можно и со стандартным буфером читать килобайты трафика.
Спасибо. Еще вопросик если можно. Полдня решал как принять всю строку, получилось наконец.
Но теперь понял, что вся она не нужна. А переменная val - в глобальных, и хранить в ней лишнее - память гробить (мне так кажется, по крайней мере).
Как принять в переменную val, допустим, первые 15 символов? Цикл строить или можно проще?
Спасибо!
https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/length/
Ввести переменную, считать каждый входящий байт, после 15 выходить из цикла break
Но это тоже костыль, анадизируйте весь входящий поток, и когда приходят нужные данные сохранять их в буфер и обрабатывать
Мой парсинг баланса из ответа модема в формате UCS2:
Нормально парсит деньги из ответов операторов большой четвёрки, с другими не пробовал.
Чтание в буфер ответа модема:
"Хвост" не поместившийся в буфер вычитывается "вникуда"
Ребята, помогите разобраться в чём дело.
симка МТС, отправляю в терминал запрос баланса AT+CUSD=1,"*100#" или ATD*100# приходит такой ответ (одинаковый):
Симка МТС: ATD*100# - ничего не работает, AT+CUSD=1,"*100#"- работает отлично, стабильно:
Вот тут, http://codius.ru/articles/GSM_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_SIM800L_%D1%87%D0%B0%D1%81%D1%82%D1%8C_1 отличный цикл статей - "как работать с джиесем", оттуда же можно понять общуюю идеологию обработки ответов модема, и надергать нужные функции для своего проекта, в том числе и не сбойный обработчик баланса.
ATD<запрос> не все операторы поддерживают, пользуйтесь AT+CUSD. В любом случае парсить надо первое вхождение числовых символов в строке, способ на вскус и цвет. Выше приводил пример, но если у Вас текстовый ответ Вам ещё проще.