Siemens C45 вместо GSM модуля подключаем к микроконтроллеру

Настало время рассказать про то, как очень полезно можно применить старенький мобильный телефон.
В данной статье речь будет идти о мобильном телефоне производства компании Siemens. Серия телефонов подойдет от Siemens С35 до Siemens M55. Так же возможен вариант работы с другими мобильными телефонами, других производителей те же Nokia, Ericsson. Основным требованием к телефону остается возможность подключить дата-кабель, обычно большинство телефонов подключались через конвертер на RS232 (COM порт персонального компьютера), то есть телефон должен работать по протоколу UART.

В интернет можно найти кучу устройств основанных на работе с мобильным телефоном, начиная от систем сигнализации (некоторые даже могут дозваниваться и передавать звук, некоторые даже видео для сетей 3G например). Прошивки правда люди не очень охотно открывают, видимо думают что сколотят состояние на продаже такой прошивки. Одним словом - капитализм V1.1. (звериный оскал).

Я в своё время купил на караваевых дачах для экспериментов Siemens C45 аж за 120 грн :-)
мой siemens c45

Скорость на которой точно работают мобильные телефоны компании Siemens составляет 19 200 бод.
Распиновка соединительного гнезда мобильного телефона показано на рисунке ниже:
распиновка телефонов siemens
Назначение выводов:
1 - земля
2 - сигнал наличия зарядного устройства
3 -
4 -
5 - отправка данных (TX)
6 - прием данных (RX)
7 -
8 -
9 - земля микрофона
10 - микрофон
11 - земля наушников
12 - вывод звука на наушники

Собственно я пользовался только тремя выводами: минус и контакты передачи/приема данных.
ВАЖНО: при подключении ноги микроконтроллера с выводом информации на вход мобильного телефона обязательно необходимо установить стабилитрон на 3Вольта, так как мобильный телефон принимает только 3 Вольта, если дать больше будет глючить и подвисать или вообще перестанет работать.

Схема подключения:
схема подключения attiny2313 к siemens c45

Для того чтобы была возможность работать с телефоном через так называемые AT команды его надо инициализировать, заодно таким образом можна проверить работоспособность самого телефона.
AT команды были разработаны специально для мобильный модулей GSM, AT комманды для телефонов Siemens в PDF формате.

Для отправки коротких текстовых сообщений существует два формата данных:
1. текстовый формат,
2. формат PDU
Соответственно мобильные телефоны должны поддерживать данные форматы если вы хотите посредством их с ними работать.
Что касается текстового формата данных, то не все телефоны поддерживают работу с ним. Для перехода мобильного телефона в режим работы с текстовым форматом необходимо выполнить определенную комманду см. AT комманды.

Благо с форматом PDU работаю все без исключения телефоны.

Ниже представлен код программы которая выполняет отправку смс 1 раз в 2 минуты.
В одно время необходимо тестировал для данное устройство для вывода из рабочего режима вражеского мобильного телефона. Программа рассчитана на работу

  1. //Шлет по 2 sms в минуту
  2. #include <avr/io.h>
  3. #include <stdlib.h>
  4.  
  5. int x,t,i,n,s,lin,b, z;
  6. unsigned char msg1[] = "AT+CMGS=13"; //Команда инициализации отправки СМС
  7. unsigned char msg2[] = "079183609310000001000A81908321528300000153\x1a";
  8. //в формате PDU текст сообщения и номер телефона абонента.
  9.  
  10. #define nop() {asm("nop");}
  11.  
  12. // function delay
  13. void delay(int t)
  14. {
  15. for (x=t; x>0 ;x--)
  16. nop ();
  17. }
  18.  
  19. // Initializing UART
  20. void USART_Init( unsigned int baud )
  21. {
  22. UBRRH = (unsigned char) (baud>>8);
  23. UBRRL = (unsigned char) baud;
  24. UCSRA = (1<<U2X); //Удвоение скорости
  25. UCSRB = ( ( 1 << RXEN ) | ( 1 << TXEN ) );
  26. //Разрешение на прием и н апередачу через USART
  27. UCSRC = (1<<USBS) | (3<<UCSZ0);
  28. }
  29. // Transmiting DATA via UART
  30. void USART_Transmit( unsigned char data )
  31. {
  32. while ( !( UCSRA & (1<<UDRE)) );
  33. UDR = data;
  34. }
  35. //------------------------------------------------------------------------
  36. // 0x0D - возврат каретки (переход в начало строки)
  37. // 0x0A - переход на новую строчку
  38. // Masage out throu port function
  39. void msgout (unsigned char msg[],int line, int back)
  40. {
  41. s=0;
  42. for (;msg[s];s++)
  43. {
  44. USART_Transmit(msg[s]);
  45. }
  46. if (line ==1)//goto new line
  47. {
  48. USART_Transmit(0x0d);
  49. USART_Transmit(0x0a);
  50. }
  51. if (back==1)
  52. {
  53. USART_Transmit(0x0d);
  54. }
  55. }
  56.  
  57. //main function
  58. int main (void)
  59. {
  60. USART_Init (47);//19200 16MHz
  61.  
  62. while(1)
  63. {
  64. for(n=0; n<15; n++)
  65. {
  66. for(lin=0; lin<100; lin++)
  67. {
  68. delay(100);
  69. }
  70. }
  71. msgout(msg1,1,0);
  72. //Генерируем паузы между отправками СМС
  73. srand (20000); //начальное число псевдо-случайного массива
  74. z = rand() % 20000; // конечное число псевдослучайного массива
  75. /Подпрограмма паузы
  76. for(s=0; s<z; s++)
  77. {
  78. for(b=0; b<100; b++)
  79. {
  80. delay(100);
  81. }
  82. }
  83. msgout(msg2,1,0); //Вывод на мобильный телефон СМС в формате PDU
  84. }
  85. }

Отдельно хочу сказать, что все АТ команды отправляемые в мобильный телефон должны заканчиваться символом перехода на новую строку - "\x1a". Его можно увидеть в конце второго сообщения в коде программы.

Проблемы, которые возникли:

Не могу понять по каким причинам телефон перестал нормально реагировать на посылку AT команд.
Отправляю проверочную команду AT в ответ получаю ответ в виде моей команды "AT" и через 10-15 секунд слово "Error". Теоретически это означает что телефон не хочет работать с AT командами. Возникает вопрос, почему так случилось. До этого все работало отлично. Может кто сталкивался с такой проблемой, огромная просьба отписаться.

Не отсылается смс Siemens c45

Нашел себе siemens c45. Так никак не могу заставить его отправить смс. Использую терминал "Hercules" для работы с COM портом. Вобщем ответы от телефона приходят, значит всё настроено правильно. Но при попытке отослать смс возникает ошибка +CMS Error: unknown error. PDU кодирую онлайн на "rednaxela.net/pdu.php".
Что ввожу(просто пример):
Я: AT+CMGS=17 (жму Enter)
Ответ: 0D0A>
Я: 07914400000000F001000B811000000000F0000004D4F29C0E (жму Enter)
.. долгая пауза
Ответ: 0D0A +CMS Error: unknown error 0D0A

Пробовал отсылать PDU часть как текстом так и в HEX формате, непомогает. Посоветуйте в какую сторону копать, если тема, конечно, еще жива!

Я думаю что проблема именно в

Я думаю что проблема именно в отправляемых данных. Так у меня все хорошо отправлялось. Кстати ты должен был принять только знак ">" после отправки длины сообщения! Так что у тебя возможно с скоростью что-то не так!

Заработало! Я отправлял

Заработало!
Я отправлял символ {1A} в конце сообщения как текст а не как HEX значение. Поэтому модем ждал окончания ввода PDU и выдавал ошибку по таймауту ожидания. Также не стоит ничего вводить до ответа модема после окончания ввода команды. Возможно это кому-то поможет.

Ну вот и гуд! Что вообще

Ну вот и гуд! Что вообще собирал? или так поиграться?

Собирал что-то типа GSM

Собирал что-то типа GSM сигнализации.(на PIC18F2550) Пока планы - научить отправлять и принимать смс.
Отправлять научил. Учу принимать :)
Сейчас думаю как организовать парсинг ответа модема. Впринципе просто баловство, чтоб вечером не скучать..

Так а ты на PIC-ах только

Так а ты на PIC-ах только собирал?
Конвертирование из PDU в текст уже сделал??? Там алгоритм немного туповатый.

Сам лично работал только с

Сам лично работал только с пиками. Так повелось. Валяются в ящике несколько штук. делаю на пике чтобы извести :).

Сделал, но не тестировал.

Сделал, но не тестировал. Формат PDU однозначно делали наркоманы-садисты.

подскажите, как при помощи

подскажите, как при помощи этой схемы можно управлять внешними нагрузками? к примеру, как можно управлять смсками?

Есть же AT команда которой

Есть же AT команда которой можно установить выдачу на выход сигнала о приходе смс-ки. Потом выполнить через команду чтение текста смс, потом переконвертировать текст из PDU формата в текстовый, прочитать само смс и выполнить определенные действия, заранее запрограммированные в МК.