Jump to content

    
Sign in to follow this  
den1s

Отправка СМС из памяти в PDU режиме

Recommended Posts

Надеюсь, что в правильную тему пишу…

Уважаемые форумчане, помогите… скоро начну биться головой обо что-нибудь)

Делаю GSM-модуль: прибор на базе модуля Quectel M72 и AVR. Прибор отслеживает состояния подключенных датчиков и по наступлению определенных событий отправляет СМСки и щелкает исполнительными элементами. Конфигурируется прибор с компа, но работает самостоятельно. По схеме наверное необходимо отметить, что AVR посредством одного UARTа подключен к M72, а вторым подключается к компу (только для конфигурации). Комп с модемом связи не имеет.

Собственно железных вопросов нет – все слава богу работает, но вот с отправкой СМС проблема. Но тут стоит опять немного пояснений дать. Прибор должен иметь возможность отправлять СМС большому числу абонентов (последовательно) и на каждое из событий предполагается свой текст. При этом тесты СМС и имена абонетов нужно писать на русском. Держать всю эту кучу инфы в слабенькой АВР не представляется возможным, поэтому было принято стратегическое решение номера, имена абонентов а так же тексты СМС хранить в самом М72. А в процессоре держать только индексы телефонной книги и хранилища СМС. Т.е. когда я все это продумывал в теории, думал что будет так: АВРка говорит М72, а оправь-ка СМС № 1 из памяти абоненту № 2 из телефонной книги, а потом СМС № 3 абоненту№ 8.

Но тут оказалась проблема: нет такой АТ-команды. Думаю, ладно, буду считывать телефонный номер абонента в буфер и просто буду подставлять в команду отправки СМС из памяти. Но тут подставил Режим PDU: оказалось там прямо в тексте хранится номер получателя и его нельзя отправить на произвольный номер. Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает.

Собственно вопрос, можно ли на практике реализовать придуманный мной подход, и как это сделать? Возможно я не до конца разобрался во всех премудростях прекрасного PDU-режима

Очень много написал, извиняюсь. Заранее спасибо.

 

Share this post


Link to post
Share on other sites

Вы ошибаетесь насчет хранения номера в тексте sms.

Вот вам пример отсылки русской sms на произвольный номер

// Функция отсылки SMS
bool sim900::sendsms(char* num, char* sms)
{
 uint8_t i;
 uint32_t tmp;

 /* устанавливаем кодировку SMS-сообщений */
 sim900::send("AT+CSCS=\"UCS2\"\r", "OK", 5000);
 sim900::send("AT+CSMP=17,167,0,8\r", "OK", 5000);
 /* Очищаем буфер передачи */
 sim900::clrs();
 /* Отсылаем команду */
 sim900::puts("AT+CMGS=");
 /* Отсылаем номер в UNICODE */
 sim900::put('"');
 for(i = 0; (i < 13) && (num[i] != 0); i++)
 {
   tmp = encode(num[i]);
   sim900::put(tmp >>  0);
   sim900::put(tmp >>  8);
   sim900::put(tmp >> 16);
   sim900::put(tmp >> 24);
 }
 sim900::puts("\"\r");
 /* Ожидаем приветствия к вводу тела СМС */
 if (sim900::wait(">", 2000) == false) return false;
 /* Отсылаем тело СМС */   
 for(i = 0; (i < 64) && (sms[i] != 0); i++)  
 {
   tmp = encode(sms[i]);
   sim900::put(tmp >>  0);
   sim900::put(tmp >>  8);
   sim900::put(tmp >> 16);
   sim900::put(tmp >> 24);
 }
 /* Отсылаем Ctrl-Z */
 sim900::put(0x1A);
 /* Ожидаем завершения отправки СМС */ 
 sleep(3000);
 if (sim900::find("ERROR")) return false;
 if (sim900::wait("+CMGS:", 5000) == false) return false;                       // ожидаем успешного завершения отсылки SMS

 return true;
}

encode() - функция преобразования в unicode

 

P.S. В теме неверной вы пишите - перенес в нужное место

Share this post


Link to post
Share on other sites

Эта тема поднималась год назад и такая команда была сделана для SIM900 серии

Я даже выкладыват тестовую версию перед тем как внесли в прошивку.

Жаль что при выборе модулей вы не обратили на это внимание.

 

Added "AT+CMGS=">index"" function to simplify short message sending operation.

Share this post


Link to post
Share on other sites
Вы ошибаетесь насчет хранения номера в тексте sms.

Вот вам пример отсылки русской sms на произвольный номер

 

....

 

P.S. В теме неверной вы пишите - перенес в нужное место

 

с этим вопросов нет. тут Вы с МК отправляете и текст и номер абонента. А у меня такая беда, что нет возможности хранить их в EEPROM (просто не помещается, его всего 512В). Мне нужно отправлять СМС из памяти на номер из записной книги по индексам. Причем если номер я еще могу извлечь из модема, то текст СМС не могу (он в самом худшем случае занимает 280 байт = 70 символов * 4 Байта/символ). Или я не верно понял Ваш код.

 

Спасибо за поправку с темо)

 

Эта тема поднималась год назад и такая команда была сделана для SIM900 серии

Я даже выкладыват тестовую версию перед тем как внесли в прошивку.

Жаль что при выборе модулей вы не обратили на это внимание.

 

Added "AT+CMGS=">index"" function to simplify short message sending operation.

К сожалению выбирали модуль без меня, мне просто дали его со словами "на, делай"

что-то мне эта команда кажется знакомой. Может она и на квиктеле есть? завтра погляжу.

Share this post


Link to post
Share on other sites

У вас у AVR сколько памяти? Если вам 300 байт стек разрывают, так не храните их в стеке. Можно в глобальный массив поместить. Ещё для экономии памяти можно хранить текст в UCS, а в PDU перекодировать на лету.

Share this post


Link to post
Share on other sites
Команда эта есть в любом модуле, но не в любом она умеет работать не напрямую с номером телефона, а с номером ячейки где размещен номер.

 

Да, это я понял после того как написал... а отредактировать пост не получилось (то ли форум тупил, то ли я)

 

У вас у AVR сколько памяти? Если вам 300 байт стек разрывают, так не храните их в стеке. Можно в глобальный массив поместить.

Мега164 у меня. Я программист к сожалению не высочайшего класса... может там и не в стеке дело (хотя вряд ли): я объвил глобальный массив в 280 байт и когда пытаюсь в него грузануть хотя бы 1 ячейку - ИАР не компилит. При этом компилится, если размер массива уменьшить в пару раз. Есть конечно, вариант поменять МК на 324 или 644 - но я надеюсь, что есть более красивое решение.

 

Ещё для экономии памяти можно хранить текст в UCS, а в PDU перекодировать на лету.

интересная идея... если все же придется хранить в EEPROM, скорее всего воспользуюсь)) спасибо)

Share this post


Link to post
Share on other sites
Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает.

 

Практически для такой задачи нужно начинать от MCU с объёмом программной памяти в ~128кБайт и оперативной памяти 8кБайт. И это весьма скромные цифры, для опытов стоило бы начать с 512/128, а потом уменьшить до реально используемого объёма. Забыл сказать о памяти данных, это тоже единицы КБайт в лучем случае (хранение только конфигурации), до единиц мегабайт (звук, трасса движения).

Edited by Frolov Kirill

Share this post


Link to post
Share on other sites
Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает.

 

я наврал, срывает не стек, конечно, просто закончилась SRAM. Сейчас запаял МК пожирнее (324 мегу), буду пробовать. Но если задуманного изначально красивого решения на индексах не получается, то проще уже хранить тексты СМС в EEPROM.

Share this post


Link to post
Share on other sites

Если в текстах будут одинаковые словосочетания типа "уважаемый абонент", то эти части можно хранить отдельно и подставлять при построении фразы чтобы не держать их в каждой фразе. То есть текст стоит оптимально продумать.

Share this post


Link to post
Share on other sites
Практически для такой задачи нужно начинать от MCU с объёмом программной памяти в ~128кБайт и оперативной памяти 8кБайт. И это весьма скромные цифры, для опытов стоило бы начать с 512/128, а потом уменьшить до реально используемого объёма.

Трудно не согласиться. Хотя собственно, из похожих соображений использую Мегу серии хх4 - для возможности при необходимости безболезненно поменять МК на более мощный.

 

Собственно, как я понимаю, придется считывать в буфер МК из памяти номера телефонов и тексты СМС, юзать обычную команду AT+CMGS и силами МК подсовывать ей параметры.

Share this post


Link to post
Share on other sites
интересная идея... если все же придется хранить в EEPROM, скорее всего воспользуюсь)) спасибо)

 

Можно не в UCS, а в ISO-8859-5 (ака ГОСТ-кодировке). Тогда байт на символ. В 4 раза компактней, чем PDU.

 

Share this post


Link to post
Share on other sites
Если в текстах будут одинаковые словосочетания типа "уважаемый абонент", то эти части можно хранить отдельно и подставлять при построении фразы чтобы не держать их в каждой фразе. То есть текст стоит оптимально продумать.

Спасибо за идейку, но к сожалению, тексты СМС записываются пользователем в процессе конфигурации прибора, а что он там напишет мне не известно)))

 

Можно не в UCS, а в ISO-8859-5 (ака ГОСТ-кодировке). Тогда байт на символ. В 4 раза компактней, чем PDU.

подскажите, поподробнее, может ссылку каку-нить: т.е. я из этого ИСО могу конвертнуть в PDU и обратно без потери информации? а как это делать?

Share this post


Link to post
Share on other sites
Трудно не согласиться. Хотя собственно, из похожих соображений использую Мегу серии хх4 - для возможности при необходимости безболезненно поменять МК на более мощный.

 

На мой взгляд AVR хуже всего подходит для подобного рода задач. Ниже почему:

 

Собственно, как я понимаю, придется считывать в буфер МК из памяти номера телефонов и тексты СМС, юзать обычную команду AT+CMGS и силами МК подсовывать ей параметры.

 

В нормальном проекте существует достаточно большой (килобайты) объём констант для этого. Текст SMS через sprintf выводится и кодируется далее в PDU... Вся суть в константах. Их практически трудно отделить от программной памяти на внешний носитель. А известные мне компиляторы для AVR имеют трудности с сохранением констант в программную память. А оперативной памяти у контроллера ещё меньше (куда и попадают константы). В PIC18 ситуация веселее если использовать hitech-C, или даже с x51 совместно с компилятором KEIL (но оба этих компилятора генерируют код в "рантайме" решающий обращение к какому типу памяти использовать). И проблемы нет с более большими контроллерами (MSP430, PIC24, PIC32, все виды ARM). Суть в общем-то в том, что AVR больше предназначены для небольших управляющих программ, и не очень подходят для обработки текста, звука и подобных задач. Всё потому, что т.н. Гарвардская архитектура разделяет код и данные. А на большие объёмы данных контроллер не расчитан. В PIC24, например, есть функция отображения программной памяти в область памяти данных, специально для того.

 

Share this post


Link to post
Share on other sites
Есть конечно, вариант поменять МК на 324 или 644 - но я надеюсь, что есть более красивое решение.

Это и есть самое правильное решение. Если сделали ошибку на этапе выбора контроллера самое разумное это исправить эту ошибку, а не городить костыли.

 

2 Frolov Kirill Для данной задачи AVR вполне адекватное решение. Все известные мне компиляторы не имеют проблем с сохранением констант в памяти програм. Единственная проблемма состоит в том, что просто константа и константа во флеш это разные типы данных, соответственно для работы с ними нужны разные функции, неудобно, но не более того(кстати это касается и PIC24). PIC32 и ARM для данного случая это, просто, стрельба из пушки по воробьям.

PS Сори на счет отображения flash в память в PIC24 не знал.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this