Неужели на C++ нет функции или процедуры дял перевода кода символа в символ? Свою что ли писать?
Переводов множество, но специально для PDU нету конечно. Там каждый символ кодируется 4мя байтами. Нужно написать свой несложный декодер, например так
ПисАл на коленке, но думаю направление понятно. Я в сях тоже не силен, может есть более оптимальный алгоритм. И еще, в принципе в терминал у меня русский не выводится, на LCD тоже, там только латиница и китайские иероглифы. Поэтому с выводом русского могу ошибаться.
Andrey12, спасибо за код, попробую. Я только не понял, в каком месте мы получаем из 4 байт 1 символ.
Может я, конечно, чего-то не понимаю, но может проще не изобретать велосипед? Почему нельзя использовать нормальный USSD- запрос и получить адекватный ответ типа ".... Vash balans 193,94 r." ?
Не совсем понял про "нормальный" USSD - запрос. Отправляя ussd запрос, я ответ получу так же на кириллице. И модуль точно так же в буфер положит точно такую же строку из набора 4х байтных кодов. Потому что модуль не умеет читать кириллицу. Он и отправить кириллицу не может. Чтобы отправить смс кириллицей, текст нужно так же разложить на четырхбайтный код, и затем уже отправлять.
онял про "нормальный" USSD - запрос. Отправляя ussd запрос, я ответ получу так же на кириллице. И модуль точно так же в буфер положит точно такую же строку из набора 4х байтных кодов. Потому что модуль не умеет читать кириллицу. Он и отправить кириллицу не может. Чтобы отправить смс кириллицей, текст нужно так же разложить на четырхбайтный код, и затем уже отправлять.
ну да, его удивлет ровно тож самое что и меня...
и кстати, запрос вы отправляете не "в кирилице", так зачем тогда божий дар с яичницей путать??
Вы для начала пробовали с модулем напрямую общаться, без библиотеки?
как АТ командами добится от модуля: ответы в обычном текстовом режиме присылать, выясняли?
тогда задумайтесь над такой строкой:
AT+CUSD=1,"*111#"
+CUSD: 0,"Na Vashem schete 1.00 r. Tarif 'Smartfon 3G'. Nomer deystvitelen do 20.03.2016. Poluchite 100 r. - 'Den'gi na zakaz': SMS na 5110",15
Отправляя ussd запрос, я ответ получу так же на кириллице. И модуль точно так же в буфер положит точно такую же строку из набора 4х байтных кодов. Потому что модуль не умеет читать кириллицу. Он и отправить кириллицу не может. Чтобы отправить смс кириллицей, текст нужно так же разложить на четырхбайтный код, и затем уже отправлять.
Что ж Вы такой упёртый?, прям как я:-)) Забудьте Вы про кирилицу свою и всевозможные преобразования, используйте USSD-запрос и получите готовую цифру баланса (см. предыдущий пост)
Я позвонил своему оператору mts и мне сказатели какую отправить ussd команду, чтобы все приходило на латинице и никаких проблем с декодингом, все просто.
Команды AT у меня не работают, пытался в самом начале своего пути, перепробвал все (или почти все методы). Почему и перешел на библиотеку. Вчера попробовал еще раз с командами - не отвечает модуль. Может быть как нибудь на досуге и разберусь, но сейчас контроллер нормально работает с тем функционалом, который нужен. Допилить скетч для расшифровки строки с баланосм проше, чем переписать весь скетч на АТ команды, и еще предварительно убив кучу времени на разобор, почему он на эти команды не отвечает.
Andrey12, код попробовал. Строку он раскладывает в такой примерно вид:
31
3139
3934
...
2E193.942E
2E
Не пойму, как избавиться от всех этих цифр, чтобы получить 193.94
Библиотека, которой Вы пользуетесь использует те же AT-команды, так что они у Вас работают, точнее только они и используются для связи с модулем. Переписывать весь скетч не нужно, можете использовать библиотеку, но при этом никто не запрещает использовать AT- команды там где это целесообразно. Библиотека нужна для упрощения жизни, а Вы её в данном случае используете чтоб поиметь головную боль. Прислушайтесь, AT-команды не могут не работать, и если у Вас с ними какие-то проблемы, то это не пройдет бесследно в дальнейшем, всё всплывёт в неподходящий момент.
alfik777, я не имею головной боли как раз с библиотекой. Да, возникла сложность в чтении запроса по балансу. Но еще раз повторю, мне проще сейчас разобраться с чтением строки, чем с тем, почему модуль не отвечает на АТ команды.
"не работают команды АТ" - это чтото новенькое.. зря вы глупости пишите.
ну, "раскладывайте" ваши строки дальше, раз команды у модуля не работают, не буду вам больше мешать.
Про АТ это действителньо странно, просто библиотека использует именно АТ команды, и ни что иное. А если библиотека работает то и АТ команды будут работать тоже.
При работе с модулями которые управляются по сериалу АТ командами, я не сторонник библиотек.
Но декодирование строк к АТ командам никакого отношения не имеет. Хотя если вы знаете АТ команду которая раскодирует строку с кирилицей то напишите что за команда. Я такую не нашел.
Я понимаю что можно принимать сообщения на латинице. И обработать их намного легче, согласен. Я не планирую управлять Arduino с помощью СМС, поэтому с приемом не заморачивался.
Но отправлять смс я хочу на русском, для этого надо кодировать строку. Рабочий код я тут выкладывал, что в этом такого плого? Да есть минусы, сообщение не 160 а всего 70 символов, но для большинства уведомлений мне достаточно.
Действительно, декодирование строк и AT- команды - это разные вещи. Просто иногда сам изобретаю велосипед, иду напролом, не прислушиваясь к советам. Главное идти своим путём, который кажется проще и понятней не останавливаясь и никого не слушая:-). Зачастую позже понимаешь, что нужно было прислушаться. Так что никто не против декодирования, где-то это действительно нужно, но в данном случае, для получения баланса в читабельном виде хотелось помочь направить на "правильный " путь, более простой и естественный.
Не пойму, как избавиться от всех этих цифр, чтобы получить 193.94
У меня при декодеровке строки - 003100390033002E003900340440002E Код выдает такой результат - 193.94À.
Почему вместо р у меня À я писал, у меня терминал не поддерживает кирилицу :-(
Если подробнее в строке каждый символ закодирован 4 байтами, то есть UNICODE.
В UNICODE диапазон 0020—007F основная латиница, 0400— 04FF это русские символы.
Ваш код в UNICODE вам надо преобразовать его в тот формат в котором вы выводите на дисплей.
С первым диапазоном, латиницей делать ничего не надо, она у всех таблиц совпадает, поправьте если я не прав. С ASCII точно совпадает.
Итак декодируем
0031 = 1 0039 = 9 0033 = 3 002E = . 0039 = 9 0034 = 4 0440 = // вот тут надо привести символ к вашей кодировке. то есть 0440 в UNICODE это р //не зная какую используете не могу подсказать как, но обычно простая математическая операция // сложение(вычитание) опереденного числа из кода 0440 002E = .
вот и получаем преобразование UNICODE в вашу кодировку, результат на экран и все.
Зачастую позже понимаешь, что нужно было прислушаться. Так что никто не против декодирования, где-то это действительно нужно, но в данном случае, для получения баланса в читабельном виде хотелось помочь направить на "правильный " путь, более простой и естественный.
А иногда послушаешь а потом жалеешь. Я так понял пока сам во всем не разберешься не поймешь как лучше. Стиль и навыки у всех свои, у кого то "и так пойдет" у когото "методология рулит, и все дложно быть красиво"
АТ команды я победил. Взгляните на результат работы в терминале. Я запрашиваю оператора слать мне СМС в латинице. Он говорит - ок, теперь все будет в транслите. Отправляю USSD запрос баланса.. хыыы.. и там опять такая же лабуда в кодировке. На этот раз 8 Bit binary Data. Я вообще х.з как это можно расшифровать, кроме как на сайте http://smspdu.benjaminerhart.com/
Отмечу, что есть 2 варианта USSD запроса: начиная с * и начиная с #. В первом варианте ответ приходит на русском языке, во втором в латинице, если оператор такой запрос поддерживает и не ответит так же, как и в первом случае.
АТ команды я победил. Взгляните на результат работы в терминале. Я запрашиваю оператора слать мне СМС в латинице. Он говорит - ок, теперь все будет в транслите. Отправляю USSD запрос баланса.. хыыы.. и там опять такая же лабуда в кодировке. На этот раз 8 Bit binary Data. Я вообще х.з как это можно расшифровать, кроме как на сайте http://smspdu.benjaminerhart.com/
Чтобы в ответе USSD была символьная информация, он должен быть закодирован в кодировке GSM 7-bit.
Но у Мегафона, транслитерация не всегда укладывается в эту кодировку. К примеру выше слово "Обещанный" переводится в "Obeshhanny`j", где присутствует обратный апостроф (гравис).
В кодировке GSM 7-bit - нет символа `(обратный апостроф), поэтому используется кодировка в GSM 8-bit data, которую нужно дополнительно раскодировать...
Из-за этих нюансов - в запросе по *100# - ты можешь встретить как наглядную информацию, так и твой "фаберже".
Все зависит от рекламы, размещенной после баланса. Вот поменяется она, и ответ может стать наглядным, если все символы после транслитерации влезут в GSM 7-bit.
Добавочка...
В кодировке GSM 7-bit есть классический апостроф (одинарная кавычка), для использования к примеру в " it's " , " i'm " и прочих случаях.
Вот если бы мегафон использовал её в транслитерации, к примеру "Obeshhanny'j" то и проблем бы не было с лишним кодированием, все влезало бы в GSM 7-bit..
Но так как используется обратный апостроф ` (гравис), отсутствующий в GSM 7-bit, то и имеем дополнительные проблемы...
у меня тоже не получается запрос баланса, работаю с ат командами
"AT"
"AT+CMGF=1" // устанавливает текстовый режим смс-сообщения
"AT+CSCS=\"GSM\"" //режим кодировки текста
"AT+IFC=1,1" //Контроль передачи данных
"AT+CNMI=1,2,2,1,0" // Настройка вывода
и все равно ответ про баланс кодированный возвращает
у меня тоже не получается запрос баланса, работаю с ат командами
"AT"
"AT+CMGF=1" // устанавливает текстовый режим смс-сообщения
"AT+CSCS=\"GSM\"" //режим кодировки текста
"AT+IFC=1,1" //Контроль передачи данных
"AT+CNMI=1,2,2,1,0" // Настройка вывода
и все равно ответ про баланс кодированный возвращает
скетч это ладно, но сделайте чуть иначе: вы без скетча вручную каждую команду введите по отдельности, убедитесь что там ок ответило, а потом с своего телефона отправьте например обычное смс отправьте, убедитесь что пришло в нужной кодировке, и только потом сделайте запрос юссд и посмотрите результат, я думаю так будет правильно решать вопрос.
и потом - "AT+CNMI=1,2,2,1,0" - настройка какого вывода? какой у вас модуль, 590й?
С самим подключением нет проблем. Меня интересует какчество связи , чувствительность микрофона и т.д. Есть ли смысл использовать модем в качестве телефона ?
Добрый день! Подскажите кто знает, как считать СМС из модуля SIM800L по запросу? Т.е. отправляю ему AT+CMGR=1,0 модем шлет текст с номером датой и текстом СМС, но вот считать его в String никак не получается корерктно, то символы срезает то сам текст пропадает. Может есть у кого кусочек скетча на такой случай? Нужно вытащить номер отправителя и текст СМС.
Глядел, везде чтение происходит т.с. на лету, когда можем шлет в порт непосредственно сообщение, при этом это все в теле основного цикла программы и программа минимального размера, т.е. данные успевают считаться из буфера и он не затыкается. Если считывать позже то обрезка до 64 байта всего сообщения где и сам текст и номер телефона.
Нужно же чтобы СМС хранилась в модуле и ситывалась в произвольное время, но вот с этим проблема, приходит то обрезанное то ничего не читается кроме самой команды на чтение если не отключить эхо от модема.
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(2, 3);
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
// int greenPin = 13;
// int yellowPin = 4;
void setup()
{
Serial.begin(19200);
gprsSerial.begin(19200);
// pinMode(greenPin, OUTPUT);
// pinMode(yellowPin, OUTPUT);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r");
delay(300);
gprsSerial.print("AT+IFC=1, 1\r");
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");
delay(300);
// gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
delay(30);
sms();
}
void sms()
{
gprsSerial.println("AT+CMGR=1,0");
delay(10);
if (!gprsSerial.available())
return;
while(gprsSerial.available())
{
char currSymb = gprsSerial.read();
if ('\r' == currSymb)
{
if (isStringMessage)
{
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
Serial.println("sms= " + currStr);
isStringMessage = false;
} else
{
if (currStr.startsWith("+CMGR:"))
{
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
}
else if ('\n' != currSymb)
{
currStr += String(currSymb);
}
}
}
Да как раз спрямо в точку, вот это работает как надо, пробовал разные задержки и как раз 1мс нормально для 9600, но считывание опять же он лайн происходит, как по команде то считать верно, вот в чем вопрос. Верхний скетч подправил, добавил команду на чтение 1й смс, удаление смс даже не включал пока.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
String PhoneNumber, SMStext;
char ch;
String val = "";
String val1 = "";
boolean isStringMessage = false;// Переменная принимает значение True, если текущая строка является сообщением
void setup() {
Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
Serial.println("Goodnight moon!");
mySerial.begin(9600); //Скорость порта для связи Arduino с GSM модулем
//mySerial.println("AT");
//mySerial.println("AT+CLIP=1\r"); //включаем АОН
delay(3000);
mySerial.println("ATE0\r"); //выключаем эхо
delay(100);
mySerial.println("AT+CMGF=1\r"); //режим кодировки СМС - обычный (для англ.)
delay(100);
mySerial.println("AT+CSCS=\"GSM\"\r"); //режим кодировки текста
delay(100);
mySerial.println("AT+CMGD=1,4\r");//команда на удаление всех СМС
delay(100);
mySerial.print("AT+CNMI=1,2,2,1,0\r"); //установка режима отправки смс в порт
delay(1000);
}
void sms()
{
//delay (1000);
if (mySerial.available()>0)
{ //есть данные от GSM модуля
delay(10); //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
while (mySerial.available())
{ //сохраняем входную строку в переменную val
ch = mySerial.read();
val += char(ch);
delay(1);
}
Serial.println("Stroka "+val);
val="";
}
}
Контроль софтверный, пробовал через AT команду установить программный контроль, тоже самое все.
На платке с Модулем пины только TX RX RST VCC GND, ну еще микрофон и динамик есть, так что DTR никак не получится.
Проблема то не в модуле, он все отдает как надо, либо сразу же с командой at+cnmi=1,2,2,1,0 либо через запрос at+cmgr=1,0 я во втором случае не могу загнать в строку сам текст, туда пишется только команда либо ответ модема-ОК, а смо сообщение никак не заносится, хотя должно бы/
У меня в проге какой то проблем, но понять что, не могу пока, опыта маловато, поэтому то собственно пишу сюда с просьбой подмогнуть и направить на путь )
Неужели на C++ нет функции или процедуры дял перевода кода символа в символ? Свою что ли писать?
Переводов множество, но специально для PDU нету конечно. Там каждый символ кодируется 4мя байтами. Нужно написать свой несложный декодер, например так
ПисАл на коленке, но думаю направление понятно. Я в сях тоже не силен, может есть более оптимальный алгоритм. И еще, в принципе в терминал у меня русский не выводится, на LCD тоже, там только латиница и китайские иероглифы. Поэтому с выводом русского могу ошибаться.
Andrey12, спасибо за код, попробую. Я только не понял, в каком месте мы получаем из 4 байт 1 символ.
Может я, конечно, чего-то не понимаю, но может проще не изобретать велосипед? Почему нельзя использовать нормальный USSD- запрос и получить адекватный ответ типа ".... Vash balans 193,94 r." ?
Не совсем понял про "нормальный" USSD - запрос. Отправляя ussd запрос, я ответ получу так же на кириллице. И модуль точно так же в буфер положит точно такую же строку из набора 4х байтных кодов. Потому что модуль не умеет читать кириллицу. Он и отправить кириллицу не может. Чтобы отправить смс кириллицей, текст нужно так же разложить на четырхбайтный код, и затем уже отправлять.
онял про "нормальный" USSD - запрос. Отправляя ussd запрос, я ответ получу так же на кириллице. И модуль точно так же в буфер положит точно такую же строку из набора 4х байтных кодов. Потому что модуль не умеет читать кириллицу. Он и отправить кириллицу не может. Чтобы отправить смс кириллицей, текст нужно так же разложить на четырхбайтный код, и затем уже отправлять.
ну да, его удивлет ровно тож самое что и меня...
и кстати, запрос вы отправляете не "в кирилице", так зачем тогда божий дар с яичницей путать??
Вы для начала пробовали с модулем напрямую общаться, без библиотеки?
как АТ командами добится от модуля: ответы в обычном текстовом режиме присылать, выясняли?
тогда задумайтесь над такой строкой:
Отправляя ussd запрос, я ответ получу так же на кириллице. И модуль точно так же в буфер положит точно такую же строку из набора 4х байтных кодов. Потому что модуль не умеет читать кириллицу. Он и отправить кириллицу не может. Чтобы отправить смс кириллицей, текст нужно так же разложить на четырхбайтный код, и затем уже отправлять.
Что ж Вы такой упёртый?, прям как я:-)) Забудьте Вы про кирилицу свою и всевозможные преобразования, используйте USSD-запрос и получите готовую цифру баланса (см. предыдущий пост)
Я позвонил своему оператору mts и мне сказатели какую отправить ussd команду, чтобы все приходило на латинице и никаких проблем с декодингом, все просто.
не, ну кому то нравятся извращения, что вы к человеку пристали :)
есть обычные АТ команды и даташит, но кому то уперто хочется библиотеку всунуть в скетч и потом мучится.
Друзья, спасибо за помощь и за мнения :)
Команды AT у меня не работают, пытался в самом начале своего пути, перепробвал все (или почти все методы). Почему и перешел на библиотеку. Вчера попробовал еще раз с командами - не отвечает модуль. Может быть как нибудь на досуге и разберусь, но сейчас контроллер нормально работает с тем функционалом, который нужен. Допилить скетч для расшифровки строки с баланосм проше, чем переписать весь скетч на АТ команды, и еще предварительно убив кучу времени на разобор, почему он на эти команды не отвечает.
Andrey12, код попробовал. Строку он раскладывает в такой примерно вид:
31
3139
3934
...
2E193.942E
2E
Не пойму, как избавиться от всех этих цифр, чтобы получить 193.94
"не работают команды АТ" - это чтото новенькое.. зря вы глупости пишите.
ну, "раскладывайте" ваши строки дальше, раз команды у модуля не работают, не буду вам больше мешать.
SIM800 не отвечает на АТ команды - аналогичная проблема.
не буду вам больше мешать.
за это отдельное спасибо.
Библиотека, которой Вы пользуетесь использует те же AT-команды, так что они у Вас работают, точнее только они и используются для связи с модулем. Переписывать весь скетч не нужно, можете использовать библиотеку, но при этом никто не запрещает использовать AT- команды там где это целесообразно. Библиотека нужна для упрощения жизни, а Вы её в данном случае используете чтоб поиметь головную боль. Прислушайтесь, AT-команды не могут не работать, и если у Вас с ними какие-то проблемы, то это не пройдет бесследно в дальнейшем, всё всплывёт в неподходящий момент.
alfik777, я не имею головной боли как раз с библиотекой. Да, возникла сложность в чтении запроса по балансу. Но еще раз повторю, мне проще сейчас разобраться с чтением строки, чем с тем, почему модуль не отвечает на АТ команды.
"не работают команды АТ" - это чтото новенькое.. зря вы глупости пишите.
ну, "раскладывайте" ваши строки дальше, раз команды у модуля не работают, не буду вам больше мешать.
Про АТ это действителньо странно, просто библиотека использует именно АТ команды, и ни что иное. А если библиотека работает то и АТ команды будут работать тоже.
При работе с модулями которые управляются по сериалу АТ командами, я не сторонник библиотек.
Но декодирование строк к АТ командам никакого отношения не имеет. Хотя если вы знаете АТ команду которая раскодирует строку с кирилицей то напишите что за команда. Я такую не нашел.
Я понимаю что можно принимать сообщения на латинице. И обработать их намного легче, согласен. Я не планирую управлять Arduino с помощью СМС, поэтому с приемом не заморачивался.
Но отправлять смс я хочу на русском, для этого надо кодировать строку. Рабочий код я тут выкладывал, что в этом такого плого? Да есть минусы, сообщение не 160 а всего 70 символов, но для большинства уведомлений мне достаточно.
Действительно, декодирование строк и AT- команды - это разные вещи. Просто иногда сам изобретаю велосипед, иду напролом, не прислушиваясь к советам. Главное идти своим путём, который кажется проще и понятней не останавливаясь и никого не слушая:-). Зачастую позже понимаешь, что нужно было прислушаться. Так что никто не против декодирования, где-то это действительно нужно, но в данном случае, для получения баланса в читабельном виде хотелось помочь направить на "правильный " путь, более простой и естественный.
Не пойму, как избавиться от всех этих цифр, чтобы получить 193.94
У меня при декодеровке строки - 003100390033002E003900340440002E
Код выдает такой результат - 193.94À.
Почему вместо р у меня À я писал, у меня терминал не поддерживает кирилицу :-(
Если подробнее в строке каждый символ закодирован 4 байтами, то есть UNICODE.
В UNICODE диапазон 0020—007F основная латиница, 0400— 04FF это русские символы.
Ваш код в UNICODE вам надо преобразовать его в тот формат в котором вы выводите на дисплей.
С первым диапазоном, латиницей делать ничего не надо, она у всех таблиц совпадает, поправьте если я не прав. С ASCII точно совпадает.
Итак декодируем
0031 = 1
0039 = 9
0033 = 3
002E = .
0039 = 9
0034 = 4
0440 = // вот тут надо привести символ к вашей кодировке. то есть 0440 в UNICODE это р
// не зная какую используете не могу подсказать как, но обычно простая математическая операция
// сложение(вычитание) опереденного числа из кода 0440
002E = .
вот и получаем преобразование UNICODE в вашу кодировку, результат на экран и все.
Зачастую позже понимаешь, что нужно было прислушаться. Так что никто не против декодирования, где-то это действительно нужно, но в данном случае, для получения баланса в читабельном виде хотелось помочь направить на "правильный " путь, более простой и естественный.
А иногда послушаешь а потом жалеешь. Я так понял пока сам во всем не разберешься не поймешь как лучше. Стиль и навыки у всех свои, у кого то "и так пойдет" у когото "методология рулит, и все дложно быть красиво"
Не пойму, как избавиться от всех этих цифр, чтобы получить 193.94
У меня при декодеровке строки - 003100390033002E003900340440002E
Код выдает такой результат - 193.94À.
Скетч беру и вставляю без всяких изменений. У меня почему то в терминале получается вот такой результат..
Скетч беру и вставляю без всяких изменений. У меня почему то в терминале получается вот такой результат..
Пардон я тестил в симуляторе - https://123d.circuits.io/
Добрался до дома, переделал отладил.
Andrey12, спасибо огромное!
А теперь предалагаю повеселится :)
АТ команды я победил. Взгляните на результат работы в терминале. Я запрашиваю оператора слать мне СМС в латинице. Он говорит - ок, теперь все будет в транслите. Отправляю USSD запрос баланса.. хыыы.. и там опять такая же лабуда в кодировке. На этот раз 8 Bit binary Data. Я вообще х.з как это можно расшифровать, кроме как на сайте http://smspdu.benjaminerhart.com/
А текст то такойже после расшифровки? Попробуйте симку в тел вставить, посм что придет. Может еще через ат команду ATD*100# попробовать запрос послать
тоже застрял на этой функции (проверки баланса), был у меня рабочий пример запроса бааланса, но к сожалению комп сгорел а пример не сохранил.
пробовал
А текст то такойже после расшифровки? Попробуйте симку в тел вставить, посм что придет. Может еще через ат команду ATD*100# попробовать запрос послать
Вот такой текст приходит в СМС:
172.49r. Oplatu zvonkov mozhno otlozhit ! Vklyuchajte Obeshhanny`j platezh *106#
Через ATD*100# тоже отправлял - теже фаберже.
ВОТ ЧТО НАШЕЛ ЦИТИРУЮ
Отмечу, что есть 2 варианта USSD запроса: начиная с * и начиная с #. В первом варианте ответ приходит на русском языке, во втором в латинице, если оператор такой запрос поддерживает и не ответит так же, как и в первом случае.
Если на мегафоне отправить #100# - то предлагается за что-то заплатить.
А перевод на латиницу у мегафона *105*0#.
АТ команды я победил. Взгляните на результат работы в терминале. Я запрашиваю оператора слать мне СМС в латинице. Он говорит - ок, теперь все будет в транслите. Отправляю USSD запрос баланса.. хыыы.. и там опять такая же лабуда в кодировке. На этот раз 8 Bit binary Data. Я вообще х.з как это можно расшифровать, кроме как на сайте http://smspdu.benjaminerhart.com/
Вот такой текст приходит в СМС:
172.49r. Oplatu zvonkov mozhno otlozhit ! Vklyuchajte Obeshhanny`j platezh *106#
Через ATD*100# тоже отправлял - теже фаберже.
Привет.
Чтобы в ответе USSD была символьная информация, он должен быть закодирован в кодировке GSM 7-bit.
Но у Мегафона, транслитерация не всегда укладывается в эту кодировку. К примеру выше слово "Обещанный" переводится в "Obeshhanny`j", где присутствует обратный апостроф (гравис).
В кодировке GSM 7-bit - нет символа `(обратный апостроф), поэтому используется кодировка в GSM 8-bit data, которую нужно дополнительно раскодировать...
Из-за этих нюансов - в запросе по *100# - ты можешь встретить как наглядную информацию, так и твой "фаберже".
Все зависит от рекламы, размещенной после баланса. Вот поменяется она, и ответ может стать наглядным, если все символы после транслитерации влезут в GSM 7-bit.
Добавочка...
В кодировке GSM 7-bit есть классический апостроф (одинарная кавычка), для использования к примеру в " it's " , " i'm " и прочих случаях.
Вот если бы мегафон использовал её в транслитерации, к примеру "Obeshhanny'j" то и проблем бы не было с лишним кодированием, все влезало бы в GSM 7-bit..
Но так как используется обратный апостроф ` (гравис), отсутствующий в GSM 7-bit, то и имеем дополнительные проблемы...
Skvo, час от часу не легче :)
Судя по всему, проще использовать СМС запрос на номер 000100. Сейчас в этом направлении копаю.
Skvo, толково объяснил.
капец, нет, тобы АТ командами сначала выяснить как перевести гсм модуль:
1 - в текстовый режим.
2 - в режим GSM ! кодировки.
после этого смс начнут о чудо - приходить в латинице в ТЕКСТОВОЙ кодировке..
и все это, внимание: - описано в пдфе на модуль, в ат командах..
но упражняйтесь по своему, не буду мешать.
у меня тоже не получается запрос баланса, работаю с ат командами
и все равно ответ про баланс кодированный возвращает
и все равно ответ про баланс кодированный возвращает
Циферки приведи этого кодированного ответа. Поглядим что там...
вот вызываю так "AT+CUSD=1,\"*100#\""
вот выдает это
у меня тоже не получается запрос баланса, работаю с ат командами
и все равно ответ про баланс кодированный возвращает
скетч это ладно, но сделайте чуть иначе: вы без скетча вручную каждую команду введите по отдельности, убедитесь что там ок ответило, а потом с своего телефона отправьте например обычное смс отправьте, убедитесь что пришло в нужной кодировке, и только потом сделайте запрос юссд и посмотрите результат, я думаю так будет правильно решать вопрос.
и потом - "AT+CNMI=1,2,2,1,0" - настройка какого вывода? какой у вас модуль, 590й?
модуль SIM800L все настройки возвращают положительный результат, функция возвращает положительный ответ.
попробуйте AT+CNMI=1,2,0,0,0 , а лучше бы вычитать в пдф на сим 900, на сим800, и на 590 - разницу в настройках этой команды.
Как я понимаю раскодировать не получится?
Подскажите пожалуйста, кто нибудь пробовал красный модем SIM800L в режиме голоса?
Судя по инструкции к нему можно микрофон с динамиком подключить
и? смотрите даташит, там схема как динамик вкл, и с какими конденсаторами нужно цепь на микрофон делать.
С самим подключением нет проблем. Меня интересует какчество связи , чувствительность микрофона и т.д. Есть ли смысл использовать модем в качестве телефона ?
Добрый день! Подскажите кто знает, как считать СМС из модуля SIM800L по запросу? Т.е. отправляю ему AT+CMGR=1,0 модем шлет текст с номером датой и текстом СМС, но вот считать его в String никак не получается корерктно, то символы срезает то сам текст пропадает. Может есть у кого кусочек скетча на такой случай? Нужно вытащить номер отправителя и текст СМС.
тема смс 100 раз здесь обсасывалась. гляньте поиском по форуму.
Глядел, везде чтение происходит т.с. на лету, когда можем шлет в порт непосредственно сообщение, при этом это все в теле основного цикла программы и программа минимального размера, т.е. данные успевают считаться из буфера и он не затыкается. Если считывать позже то обрезка до 64 байта всего сообщения где и сам текст и номер телефона.
Нужно же чтобы СМС хранилась в модуле и ситывалась в произвольное время, но вот с этим проблема, приходит то обрезанное то ничего не читается кроме самой команды на чтение если не отключить эхо от модема.
Задержку пробовали поставить?
Да как раз спрямо в точку, вот это работает как надо, пробовал разные задержки и как раз 1мс нормально для 9600, но считывание опять же он лайн происходит, как по команде то считать верно, вот в чем вопрос. Верхний скетч подправил, добавил команду на чтение 1й смс, удаление смс даже не включал пока.
контроль передачи в сериал - софтверный или аппаратный?
В гсм модуле некоторые истояники рекомендуют DTR на землю замкнуть.
Контроль софтверный, пробовал через AT команду установить программный контроль, тоже самое все.
На платке с Модулем пины только TX RX RST VCC GND, ну еще микрофон и динамик есть, так что DTR никак не получится.
Проблема то не в модуле, он все отдает как надо, либо сразу же с командой at+cnmi=1,2,2,1,0 либо через запрос at+cmgr=1,0 я во втором случае не могу загнать в строку сам текст, туда пишется только команда либо ответ модема-ОК, а смо сообщение никак не заносится, хотя должно бы/
У меня в проге какой то проблем, но понять что, не могу пока, опыта маловато, поэтому то собственно пишу сюда с просьбой подмогнуть и направить на путь )
вот что значит неполноценные модули........
Есть идеи по первому скетчу что не так? Про модуль понятно уже...
так что именно не получается? не совсем понятно. смс не отправляется?
парсить смс не получается? - в интернете достаточно разных вараинтов примера разборки смс, посмотрите пример и думаю выберите, то, что заработает.
не получается считать смс по команде на чтение смс и загнать сам текст в переменную для последующего разбора.
на команду чтения смс отвечает только в терминальном режиме вот так:
команда at+cmgr=1,0
+CMGR: "REC READ","+79206299093","","16/03/28,01:03:48+12"
temp 22
OK
в программе по вызову процедуры чтения ничего не шлет
На платке с Модулем пины только TX RX RST VCC GND, ну еще микрофон и динамик есть, так что DTR никак не получится.
А это не подходит?
Ха реально, есть, я что то не обратил внимание, плпта еще там обрезана и пин для звонка не подписан)