реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Отправка СМС из памяти в PDU режиме, Отправка СМС из памяти в PDU режиме на произвольный номер
den1s
сообщение May 31 2012, 12:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



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


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
Nixon
сообщение May 31 2012, 14:20
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Вы ошибаетесь насчет хранения номера в тексте sms.
Вот вам пример отсылки русской sms на произвольный номер
CODE

// Функция отсылки 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. В теме неверной вы пишите - перенес в нужное место


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
CADiLO
сообщение May 31 2012, 14:34
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 6 023
Регистрация: 26-08-05
Из: Днепр
Пользователь №: 7 988



Эта тема поднималась год назад и такая команда была сделана для SIM900 серии
Я даже выкладыват тестовую версию перед тем как внесли в прошивку.
Жаль что при выборе модулей вы не обратили на это внимание.

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


--------------------
Не можна втрачати надію. Не можна здаватися до останньої миті. Можливо саме вона, остання мить, принесе весну, яка стане початком нового життя.
Go to the top of the page
 
+Quote Post
den1s
сообщение May 31 2012, 17:23
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Цитата(Nixon @ May 31 2012, 18:20) *
Вы ошибаетесь насчет хранения номера в тексте sms.
Вот вам пример отсылки русской sms на произвольный номер

....

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


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

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

Цитата(CADiLO @ May 31 2012, 18:34) *
Эта тема поднималась год назад и такая команда была сделана для SIM900 серии
Я даже выкладыват тестовую версию перед тем как внесли в прошивку.
Жаль что при выборе модулей вы не обратили на это внимание.

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

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


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
CADiLO
сообщение May 31 2012, 18:20
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 6 023
Регистрация: 26-08-05
Из: Днепр
Пользователь №: 7 988



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


--------------------
Не можна втрачати надію. Не можна здаватися до останньої миті. Можливо саме вона, остання мить, принесе весну, яка стане початком нового життя.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение May 31 2012, 18:30
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



У вас у AVR сколько памяти? Если вам 300 байт стек разрывают, так не храните их в стеке. Можно в глобальный массив поместить. Ещё для экономии памяти можно хранить текст в UCS, а в PDU перекодировать на лету.
Go to the top of the page
 
+Quote Post
den1s
сообщение May 31 2012, 19:01
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Цитата(CADiLO @ May 31 2012, 22:20) *
Команда эта есть в любом модуле, но не в любом она умеет работать не напрямую с номером телефона, а с номером ячейки где размещен номер.


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

Цитата(andrewlekar @ May 31 2012, 22:30) *
У вас у AVR сколько памяти? Если вам 300 байт стек разрывают, так не храните их в стеке. Можно в глобальный массив поместить.

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

Цитата(andrewlekar @ May 31 2012, 22:30) *
Ещё для экономии памяти можно хранить текст в UCS, а в PDU перекодировать на лету.

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


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
Frolov Kirill
сообщение Jun 1 2012, 08:48
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643



Цитата(den1s @ May 31 2012, 16:52) *
Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает.


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

Сообщение отредактировал Frolov Kirill - Jun 1 2012, 09:14
Go to the top of the page
 
+Quote Post
den1s
сообщение Jun 1 2012, 09:05
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Цитата(den1s @ May 31 2012, 16:52) *
Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает.


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


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
CADiLO
сообщение Jun 1 2012, 09:10
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 6 023
Регистрация: 26-08-05
Из: Днепр
Пользователь №: 7 988



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


--------------------
Не можна втрачати надію. Не можна здаватися до останньої миті. Можливо саме вона, остання мить, принесе весну, яка стане початком нового життя.
Go to the top of the page
 
+Quote Post
den1s
сообщение Jun 1 2012, 09:13
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Цитата(Frolov Kirill @ Jun 1 2012, 12:48) *
Практически для такой задачи нужно начинать от MCU с объёмом программной памяти в ~128кБайт и оперативной памяти 8кБайт. И это весьма скромные цифры, для опытов стоило бы начать с 512/128, а потом уменьшить до реально используемого объёма.

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

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


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
Frolov Kirill
сообщение Jun 1 2012, 09:15
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643



Цитата(den1s @ May 31 2012, 23:01) *
интересная идея... если все же придется хранить в EEPROM, скорее всего воспользуюсь)) спасибо)


Можно не в UCS, а в ISO-8859-5 (ака ГОСТ-кодировке). Тогда байт на символ. В 4 раза компактней, чем PDU.
Go to the top of the page
 
+Quote Post
den1s
сообщение Jun 1 2012, 09:23
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 17-03-11
Пользователь №: 63 677



Цитата(CADiLO @ Jun 1 2012, 13:10) *
Если в текстах будут одинаковые словосочетания типа "уважаемый абонент", то эти части можно хранить отдельно и подставлять при построении фразы чтобы не держать их в каждой фразе. То есть текст стоит оптимально продумать.

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

Цитата(Frolov Kirill @ Jun 1 2012, 13:15) *
Можно не в UCS, а в ISO-8859-5 (ака ГОСТ-кодировке). Тогда байт на символ. В 4 раза компактней, чем PDU.

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


--------------------
"Одной мотивации недостаточно: если у вас есть идиот и вы его мотивировали, то в результате вы получите мотивированного идиота." - Джим Рон
Go to the top of the page
 
+Quote Post
Frolov Kirill
сообщение Jun 1 2012, 09:25
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643



Цитата(den1s @ Jun 1 2012, 13:13) *
Трудно не согласиться. Хотя собственно, из похожих соображений использую Мегу серии хх4 - для возможности при необходимости безболезненно поменять МК на более мощный.


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

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


В нормальном проекте существует достаточно большой (килобайты) объём констант для этого. Текст SMS через sprintf выводится и кодируется далее в PDU... Вся суть в константах. Их практически трудно отделить от программной памяти на внешний носитель. А известные мне компиляторы для AVR имеют трудности с сохранением констант в программную память. А оперативной памяти у контроллера ещё меньше (куда и попадают константы). В PIC18 ситуация веселее если использовать hitech-C, или даже с x51 совместно с компилятором KEIL (но оба этих компилятора генерируют код в "рантайме" решающий обращение к какому типу памяти использовать). И проблемы нет с более большими контроллерами (MSP430, PIC24, PIC32, все виды ARM). Суть в общем-то в том, что AVR больше предназначены для небольших управляющих программ, и не очень подходят для обработки текста, звука и подобных задач. Всё потому, что т.н. Гарвардская архитектура разделяет код и данные. А на большие объёмы данных контроллер не расчитан. В PIC24, например, есть функция отображения программной памяти в область памяти данных, специально для того.
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jun 1 2012, 09:26
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(den1s @ May 31 2012, 22:01) *
Есть конечно, вариант поменять МК на 324 или 644 - но я надеюсь, что есть более красивое решение.

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

2 Frolov Kirill Для данной задачи AVR вполне адекватное решение. Все известные мне компиляторы не имеют проблем с сохранением констант в памяти програм. Единственная проблемма состоит в том, что просто константа и константа во флеш это разные типы данных, соответственно для работы с ними нужны разные функции, неудобно, но не более того(кстати это касается и PIC24). PIC32 и ARM для данного случая это, просто, стрельба из пушки по воробьям.
PS Сори на счет отображения flash в память в PIC24 не знал.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 00:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016