den1s 0 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба Надеюсь, что в правильную тему пишу… Уважаемые форумчане, помогите… скоро начну биться головой обо что-нибудь) Делаю GSM-модуль: прибор на базе модуля Quectel M72 и AVR. Прибор отслеживает состояния подключенных датчиков и по наступлению определенных событий отправляет СМСки и щелкает исполнительными элементами. Конфигурируется прибор с компа, но работает самостоятельно. По схеме наверное необходимо отметить, что AVR посредством одного UARTа подключен к M72, а вторым подключается к компу (только для конфигурации). Комп с модемом связи не имеет. Собственно железных вопросов нет – все слава богу работает, но вот с отправкой СМС проблема. Но тут стоит опять немного пояснений дать. Прибор должен иметь возможность отправлять СМС большому числу абонентов (последовательно) и на каждое из событий предполагается свой текст. При этом тесты СМС и имена абонетов нужно писать на русском. Держать всю эту кучу инфы в слабенькой АВР не представляется возможным, поэтому было принято стратегическое решение номера, имена абонентов а так же тексты СМС хранить в самом М72. А в процессоре держать только индексы телефонной книги и хранилища СМС. Т.е. когда я все это продумывал в теории, думал что будет так: АВРка говорит М72, а оправь-ка СМС № 1 из памяти абоненту № 2 из телефонной книги, а потом СМС № 3 абоненту№ 8. Но тут оказалась проблема: нет такой АТ-команды. Думаю, ладно, буду считывать телефонный номер абонента в буфер и просто буду подставлять в команду отправки СМС из памяти. Но тут подставил Режим PDU: оказалось там прямо в тексте хранится номер получателя и его нельзя отправить на произвольный номер. Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает. Собственно вопрос, можно ли на практике реализовать придуманный мной подход, и как это сделать? Возможно я не до конца разобрался во всех премудростях прекрасного PDU-режима Очень много написал, извиняюсь. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nixon 3 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба Вы ошибаетесь насчет хранения номера в тексте 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. В теме неверной вы пишите - перенес в нужное место Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CADiLO 8 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба Эта тема поднималась год назад и такая команда была сделана для SIM900 серии Я даже выкладыват тестовую версию перед тем как внесли в прошивку. Жаль что при выборе модулей вы не обратили на это внимание. Added "AT+CMGS=">index"" function to simplify short message sending operation. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den1s 0 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба Вы ошибаетесь насчет хранения номера в тексте sms. Вот вам пример отсылки русской sms на произвольный номер .... P.S. В теме неверной вы пишите - перенес в нужное место с этим вопросов нет. тут Вы с МК отправляете и текст и номер абонента. А у меня такая беда, что нет возможности хранить их в EEPROM (просто не помещается, его всего 512В). Мне нужно отправлять СМС из памяти на номер из записной книги по индексам. Причем если номер я еще могу извлечь из модема, то текст СМС не могу (он в самом худшем случае занимает 280 байт = 70 символов * 4 Байта/символ). Или я не верно понял Ваш код. Спасибо за поправку с темо) Эта тема поднималась год назад и такая команда была сделана для SIM900 серии Я даже выкладыват тестовую версию перед тем как внесли в прошивку. Жаль что при выборе модулей вы не обратили на это внимание. Added "AT+CMGS=">index"" function to simplify short message sending operation. К сожалению выбирали модуль без меня, мне просто дали его со словами "на, делай" что-то мне эта команда кажется знакомой. Может она и на квиктеле есть? завтра погляжу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CADiLO 8 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба Команда эта есть в любом модуле, но не в любом она умеет работать не напрямую с номером телефона, а с номером ячейки где размещен номер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба У вас у AVR сколько памяти? Если вам 300 байт стек разрывают, так не храните их в стеке. Можно в глобальный массив поместить. Ещё для экономии памяти можно хранить текст в UCS, а в PDU перекодировать на лету. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den1s 0 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба Команда эта есть в любом модуле, но не в любом она умеет работать не напрямую с номером телефона, а с номером ячейки где размещен номер. Да, это я понял после того как написал... а отредактировать пост не получилось (то ли форум тупил, то ли я) У вас у AVR сколько памяти? Если вам 300 байт стек разрывают, так не храните их в стеке. Можно в глобальный массив поместить. Мега164 у меня. Я программист к сожалению не высочайшего класса... может там и не в стеке дело (хотя вряд ли): я объвил глобальный массив в 280 байт и когда пытаюсь в него грузануть хотя бы 1 ячейку - ИАР не компилит. При этом компилится, если размер массива уменьшить в пару раз. Есть конечно, вариант поменять МК на 324 или 644 - но я надеюсь, что есть более красивое решение. Ещё для экономии памяти можно хранить текст в UCS, а в PDU перекодировать на лету. интересная идея... если все же придется хранить в EEPROM, скорее всего воспользуюсь)) спасибо) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fk1 0 1 июня, 2012 Опубликовано 1 июня, 2012 (изменено) · Жалоба Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает. Практически для такой задачи нужно начинать от MCU с объёмом программной памяти в ~128кБайт и оперативной памяти 8кБайт. И это весьма скромные цифры, для опытов стоило бы начать с 512/128, а потом уменьшить до реально используемого объёма. Забыл сказать о памяти данных, это тоже единицы КБайт в лучем случае (хранение только конфигурации), до единиц мегабайт (звук, трасса движения). Изменено 1 июня, 2012 пользователем Frolov Kirill Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den1s 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Забирать текст PDU из модема и подправлять номер не выходит – этот текст может достигать 300 байт – мне стек в АВР срывает. я наврал, срывает не стек, конечно, просто закончилась SRAM. Сейчас запаял МК пожирнее (324 мегу), буду пробовать. Но если задуманного изначально красивого решения на индексах не получается, то проще уже хранить тексты СМС в EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CADiLO 8 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Если в текстах будут одинаковые словосочетания типа "уважаемый абонент", то эти части можно хранить отдельно и подставлять при построении фразы чтобы не держать их в каждой фразе. То есть текст стоит оптимально продумать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den1s 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Практически для такой задачи нужно начинать от MCU с объёмом программной памяти в ~128кБайт и оперативной памяти 8кБайт. И это весьма скромные цифры, для опытов стоило бы начать с 512/128, а потом уменьшить до реально используемого объёма. Трудно не согласиться. Хотя собственно, из похожих соображений использую Мегу серии хх4 - для возможности при необходимости безболезненно поменять МК на более мощный. Собственно, как я понимаю, придется считывать в буфер МК из памяти номера телефонов и тексты СМС, юзать обычную команду AT+CMGS и силами МК подсовывать ей параметры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fk1 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба интересная идея... если все же придется хранить в EEPROM, скорее всего воспользуюсь)) спасибо) Можно не в UCS, а в ISO-8859-5 (ака ГОСТ-кодировке). Тогда байт на символ. В 4 раза компактней, чем PDU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den1s 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Если в текстах будут одинаковые словосочетания типа "уважаемый абонент", то эти части можно хранить отдельно и подставлять при построении фразы чтобы не держать их в каждой фразе. То есть текст стоит оптимально продумать. Спасибо за идейку, но к сожалению, тексты СМС записываются пользователем в процессе конфигурации прибора, а что он там напишет мне не известно))) Можно не в UCS, а в ISO-8859-5 (ака ГОСТ-кодировке). Тогда байт на символ. В 4 раза компактней, чем PDU. подскажите, поподробнее, может ссылку каку-нить: т.е. я из этого ИСО могу конвертнуть в PDU и обратно без потери информации? а как это делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fk1 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Трудно не согласиться. Хотя собственно, из похожих соображений использую Мегу серии хх4 - для возможности при необходимости безболезненно поменять МК на более мощный. На мой взгляд AVR хуже всего подходит для подобного рода задач. Ниже почему: Собственно, как я понимаю, придется считывать в буфер МК из памяти номера телефонов и тексты СМС, юзать обычную команду AT+CMGS и силами МК подсовывать ей параметры. В нормальном проекте существует достаточно большой (килобайты) объём констант для этого. Текст SMS через sprintf выводится и кодируется далее в PDU... Вся суть в константах. Их практически трудно отделить от программной памяти на внешний носитель. А известные мне компиляторы для AVR имеют трудности с сохранением констант в программную память. А оперативной памяти у контроллера ещё меньше (куда и попадают константы). В PIC18 ситуация веселее если использовать hitech-C, или даже с x51 совместно с компилятором KEIL (но оба этих компилятора генерируют код в "рантайме" решающий обращение к какому типу памяти использовать). И проблемы нет с более большими контроллерами (MSP430, PIC24, PIC32, все виды ARM). Суть в общем-то в том, что AVR больше предназначены для небольших управляющих программ, и не очень подходят для обработки текста, звука и подобных задач. Всё потому, что т.н. Гарвардская архитектура разделяет код и данные. А на большие объёмы данных контроллер не расчитан. В PIC24, например, есть функция отображения программной памяти в область памяти данных, специально для того. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=F8= 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Есть конечно, вариант поменять МК на 324 или 644 - но я надеюсь, что есть более красивое решение. Это и есть самое правильное решение. Если сделали ошибку на этапе выбора контроллера самое разумное это исправить эту ошибку, а не городить костыли. 2 Frolov Kirill Для данной задачи AVR вполне адекватное решение. Все известные мне компиляторы не имеют проблем с сохранением констант в памяти програм. Единственная проблемма состоит в том, что просто константа и константа во флеш это разные типы данных, соответственно для работы с ними нужны разные функции, неудобно, но не более того(кстати это касается и PIC24). PIC32 и ARM для данного случая это, просто, стрельба из пушки по воробьям. PS Сори на счет отображения flash в память в PIC24 не знал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться