Терминал для GSM модема SIM900 — SIM900 DIALOG
Полтора года назад на сайте публиковал цикл статей по GSM модему SIM900. Это один из добротных GSM модемов, который получил широкую известность и распространение в радиолюбительских кругах. С тех пор уже многое изменилось и вышло много различных более современных модемов, но SIM900 остается классикой. По нему можно найти множество документации и примеров работы с ним во всех обжитых радиолюбителями уголках интернета.
Окно программы
Недавно один из читателей моего скромного сайта прислал программу терминал, заточененную для работы с этим GSM модемом.
Программа имеет стандартное интуитивно понятное меню работы с лог-файлом и меню для настройки связи по СОМ-порту. Единственная команда, требующая пояснения – это “Лог/Открыть для копирования”. После выполнения данной команды открывается окно, похожее на окно программы блокнота, в которое копируется всё содержимое открытого диалога. Это сделано для возможности оперативного копирования без закрытия программы и поиска последнего лог-файла.
Опишем более подробно специализированные функции терминала. На рисунке ниже представлен один из скриншотов программы.
Интерфейс программы
Программа может работать в режиме диалога и в режиме сниффера. По умолчанию программа работает в режиме диалога, в режим сниффера переключается при установке соответствующей радиокнопки (5). Так же по умолчанию ведётся запись в лог-файл, которую при необходимости можно отключить, убрав соответствующий флажок слева от радиокнопок. Имя лог-файла формируется из текущей даты и времени начала записи, чем гарантируется его уникальность. При превышении числа записей 10000 автоматически создаётся новый файл лога.
Рассмотрим работу программы в режиме диалога. В программе имеется главное окно, в котором отображается лог общения пользователя с модулем SIM900, командная строка и кнопки для быстрого формирования AT-команд. Высоту главного окна можно изменять с помощью двух кнопок в правом верхнем углу (2). Имеется своеобразно оформленная справка, отображающаяся в белом квадрате правого нижнего угла при наведении указателя мыши на соответствующий элемент или кнопку программы. На скриншоте показан пример отображения справки при наведении курсора мыши на кнопку с командой AT+COPS=?. Справочные данные не указаны для кнопок команд вкладок от GPRS до FTP. Их описание есть в документации на модуль и следует ожидать появления в следующих версиях программы. Над командной строкой имеются кнопка формирования пустой АТ-команды и кнопки добавления в конец команды кодов перевода каретки и окончания строки(1). Ещё выше расположена строка для отображения содержимого командной строки в виде набора 16ричных чисел, которые будут отправлены в COM-порт после нажатия кнопки “Отправить”. Есть возможность выделения содержимого данной строки в целях дальнейшего копирования непосредственно из строки или из окна просмотра на соответствующей вкладке. Кнопка “Отправить” активизируется при удачном подключении к COM-порту в режиме “Диалог”. Состояние связи отображается в правом нижнем углу (3), настройка связи и подключение выполняется посредством пункта главного меню “Настройки”.
Ввод данных в командную строку можно формировать трёмя способами:
- Ручной набор;
- С помощью кнопок формирования готовых команд;
- Копирование ранее использованных команд из окна диалога.
Первый способ понятен — набираем вручную любой набор символов и жмём кнопку “Отправить”, далее смотрим в окно диалога. Отправленная команда помечается набором символов “- — — >”
При втором способе ввода команда формируются автоматически после нажатия соответствующей кнопки на одной из вкладок. После нажатия некоторых кнопок требуются ручное редактирование содержимого командной строки (например, ввод PIN-кода). В этом случае командная строка меняет цвет с белого на жёлтый и если нажать кнопку “Отправить” без предварительного редактирования, то строка примет красный цвет, т.е. программа даёт знать, что пользователь забыл выполнить обязательное ручное редактирование параметров команды. Цвет командной строки становится белым после того, как пользователь переместил фокус ввода в командную строку, после этого возможна отправка содержимого модулю. Т.е. программа предположила, что пользователь выполнил какое-то ручное редактирование, но при этом не анализирует правильность изменений с точки зрения синтаксиса команд. Если потребуется ввод данных для отправки через стек TCP/IP, то цвет командной строки станет синим. Данное изменение цвета происходит при появлении приглашения от модуля в виде символа “>”.
Третий способ – это непосредственное копирование содержимого из окна диалога, которое выполняется автоматически при выделении соответствующей строки (4), это задумано для того, чтобы не набирать заново ранее набранные длинные команды. Особенно это полезно при повторном воспроизведении команд из окрытых лог-файлов, записанных в режиме сниффера.
Для работы в режиме сниффера требуется дополнительное аппаратное и программное обеспечение. Автор реализовал следующий принцип подключения для считывания лога общения модуля с микроконтроллером в стороннем устройстве:
Подключение сниффера
Для конкретной реализации сниффера был применён микроконтроллер LPC1768 в составе демонстрационной платы SK-MLPC1768, код программы примитивный, поэтому приведу его здесь:
#include "iolpc1766.h" #include "LPC17xx.h" main() { FIO1DIR |= (1 < < 29)|(1 << 28); FIO0DIR |= (1 << 2); // 1. Init OSC SCS_bit.OSCRANGE = 0; SCS_bit.OSCEN = 1; // 2. Wait for OSC ready while(!SCS_bit.OSCSTAT); // 3. Disconnect PLL PLL0CON_bit.PLLC = 0; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 4. Disable PLL PLL0CON_bit.PLLE = 0; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 5. Select source clock for PLL CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source. PCLKSEL0 = PCLKSEL1 = 0; // other peripherals 96/4 = 24MHz // 6. Set PLL settings 288 MHz PLL0CFG_bit.MSEL = 18-1; PLL0CFG_bit.NSEL = 2-1; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 7. Enable PLL PLL0CON_bit.PLLE = 1; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 8. Wait for the PLL to achieve lock while(!PLL0STAT_bit.PLOCK); // 9. Set clk divider settings CCLKCFG = 3-1; // 1/3 Fpll // 10. Connect the PLL PLL0CON_bit.PLLC = 1; PLL0FEED = 0xAA; PLL0FEED = 0x55; // setup UART0 ///////////////////////////////////////////////////////////////// PINSEL0 |= (1 << 4)|(1 << 6); //TX RX PCLKSEL0 |= (1 << 6); //Тактирование UART0 1:1 U0LCR |= 0x83; //8 бит, разрешение делителя U0DLL = 0x28; U0LCR &=~ 0x80; //запрет делителя U0IER |= 0x1; //Разрешение прерываний UART0 //////////////////////////////////////////////////////////////////////////////// // setup UART2 ///////////////////////////////////////////////////////////////// PCONP |= (1 << 24); //Power UART2 PINSEL0 |= (1 << 20) | (1 << 22); //TX RX PCLKSEL1 |= (1 << 16); //Тактирование UART2 1:1 U2LCR |= 0x83; //8 бит, разрешение делителя U2DLL = 0x28; //делитель U2LCR &=~ 0x80; //запрет делителя U2IER |= 0x1; //Разрешение прерываний UART3 //////////////////////////////////////////////////////////////////////////////// // setup UART3 ///////////////////////////////////////////////////////////////// PCONP |= (1 << 25); //Power UART3 PINSEL0 |= (2 << 0) | (2 << 2); //TX RX PCLKSEL1 |= (1 << 18); //Тактирование UART3 1:1 U3LCR |= 0x83; //8 бит, разрешение делителя U3DLL = 0x28; //делитель 0x50 - 9600, 0x28 - 19200, 0x14 - 38400 U3LCR &=~ 0x80; //запрет делителя U3IER |= 0x1; //Разрешение прерываний UART3 //////////////////////////////////////////////////////////////////////////////// __enable_irq(); //Разрешение всех прерываний AIRCR = 0x05FA0200; //ключ + группировка приоритетов прерываний IP1 = 0x00000800; //приоритет прерывания (UART0) NVIC_EnableIRQ(UART2_IRQn); //Enable IRQ UART2 NVIC_EnableIRQ(UART3_IRQn); //Enable IRQ UART3 while(1) {} } void UART2_IRQHandler (void) { while (!(U0LSR&0x20)); U0THR = U2RBR; NVIC_ClearPendingIRQ(UART2_IRQn); return; } void UART3_IRQHandler (void) { while (!(U0LSR&0x20)); U0THR = U3RBR; NVIC_ClearPendingIRQ(UART3_IRQn); return; }
В программе выполняется инициализация выводов (RX – UART2, RX-UART3, TX-UART0), настройка тактирования с использованием кварца 12МГц, настройка интерфейсов UART на скорость приёма и передачи 115200 бит/c, настройка прерываний. Предполагается, что общение микроконтроллера происходит в полудуплексном режиме, т.е. активность на линиях TX-RX подопытного устройства разнесена по времени. В этом случае есть простая возможность поочерёдно считывать данные с обеих линий и сразу же перенаправлять их на одну линию TX. Если смотреть осциллографом сигналы на линиях, то будем иметь примерно такую картину:
Осциллограмма UART
Отличия работы программы в режиме диалога и сниффера следующие:
- Становится неактивным окно диалога, это сделано для того, чтобы случайно не передать фокус управления в данное окно, иначе считываемый лог будет крутиться только в одной строчке. Остаётся только наблюдать на бегущие строки процесса общения микроконтроллера с модулем.
- Становится неактивной кнопка “Отправить” – она тут не нужна. Функциональность всех остальных элементов сохраняется.
Считанный процесс общения так же сохраняется в лог-файле и его можно просмотреть:
Пример работы программы
Скриншот был намеренно заляпан, т.к. считывание выполнялось с коммерческого прибора.
Если строка полностью не умещается на всей длине окна, то её содержимое можно посмотреть на вкладке “ОКНО ПРОСМОТРА”, для этого нужно выделить интересующую строку в окне диалога. Так же имеется возможность копировать строку команды из окна диалога щелчком левой кнопки мыши для повторного использования в режиме “Диалог”. Признаком команды является присутствие символов AT в начале строки, выделение других строк не приводит к изменению содержимого командной строки.
Программа распространяется за спасибо 🙂
Иван Абдулхаев | 17.04.2015 | Программы |
Make_Pic пишет 03.06.2015 в 17:55 #
На чем написана программа? На Qt?
Иван Абдулхаев пишет 03.06.2015 в 18:09 #
На Delphi писал
Иван Абдулхаев пишет 03.06.2015 в 18:13 #
Начальнику сайта отправил универсальный и более удобный терминал с описанием. У него пока не дошли руки выложить здесь 🙂
Make_Pic пишет 08.06.2015 в 14:50 #
Если не сложно и можно — отправь мне пожалуйста на мыло — anатоl 911 соба ка майл тчк ру
Все латинецей без пробелов
Николай пишет 15.10.2015 в 08:38 #
Есть какие либо тонкости в настройке связи? Почему то упорно не видит мой USB to serial на 13-м порте, хотя другие программы подцепляют его без проблем..
Иван Абдулхаев пишет 15.10.2015 в 10:38 #
Вся настройка связи на основе библиотечных функций Delphi, своего ничего в их работу не добавлял. Вполне возможно, что в этих функциях есть максимальный номер порта, к примеру COM12, а я на автопилоте настрочил до COM20. Этот момент я не проверял. На портах 1-10 работает? Вы свой переходник через хаб включаете, если он как COM13 определяется? Попробуйте без него. Заметил, что при подключении переходника напрямую к системнику номер COM-порта бывает в первой десятке, попробуйте в другие разъёмы USB повставлять.
Николай пишет 15.10.2015 в 17:15 #
Включаю без хаба, в диспетчере устройств стабильно определяется как profilic USB-to-serial-Bridge COM13. Успешно распознается гипертерминалом. Попробовал воткнуть в другие порты, там вообще присваиваются 14-й и 24-й номера.
Николай пишет 15.10.2015 в 17:47 #
Кстати, на GSM-dialog ошибка та же, порт не открывается.
Иван Абдулхаев пишет 15.10.2015 в 20:44 #
Я своё видение проблемы написал, других предположений нет. GSM-dialog написан на основе SIM900 DIALOG с использованием тех же функций Delphi, поэтому логично, что ошибка та же. Спасибо за замечание, в будущем при случае учту где-нибудь.
Иван Абдулхаев пишет 15.10.2015 в 20:47 #
Пробуйте сделать так, чтобы COM-порт инициализировался порядковым номером от 0 до 10 или попробуйте задать его вручную, если получится.
Николай пишет 16.10.2015 в 10:46 #
Что вы! Какое там замечание, это наблюдение любителя. 🙂 Изменил вручную номе порта на 9-й и все завелось. Спасибо за софтинку!
Влад пишет 21.12.2015 в 19:46 #
Прога супер. Все заработало с первого раза. Но есть пару моментов:
-АТ команда»Информация об ошибках» выглядит так «AT+CMEE=x», у вас «ATCME=x».
— не приходит код ошибки в цифровом виде.
Иван Абдулхаев пишет 21.12.2015 в 21:14 #
Влад, во второй версии программы есть возможность редактирования команд, а тут получается очепатался немного 🙂
Иван Абдулхаев пишет 21.12.2015 в 21:15 #
Вторая версия с возможностью редактирования команд здесь http://alex-exe.ru/programm/gsm-dialog/