Терминал для GSM модема SIM900 — SIM900 DIALOG

Полтора года назад на сайте публиковал цикл статей по GSM модему SIM900. Это один из добротных GSM модемов, который получил широкую известность и распространение в радиолюбительских кругах. С тех пор уже многое изменилось и вышло много различных более современных модемов, но SIM900 остается классикой. По нему можно найти множество документации и примеров работы с ним во всех обжитых радиолюбителями уголках интернета.

Окно программы

Окно программы

Недавно один из читателей моего скромного сайта прислал программу терминал, заточененную для работы с этим GSM модемом.

Программа имеет стандартное интуитивно понятное меню работы с лог-файлом и меню для настройки связи по СОМ-порту. Единственная команда, требующая пояснения – это “Лог/Открыть для копирования”. После выполнения данной команды открывается окно, похожее на окно программы блокнота, в которое копируется всё содержимое открытого диалога. Это сделано для возможности оперативного копирования без закрытия программы и поиска последнего лог-файла.

Опишем более подробно специализированные функции терминала. На рисунке ниже представлен один из скриншотов программы.

Интерфейс программы

Интерфейс программы

Программа может работать в режиме диалога и в режиме сниффера. По умолчанию программа работает в режиме диалога, в режим сниффера переключается при установке соответствующей радиокнопки (5). Так же по умолчанию ведётся запись в лог-файл, которую при необходимости можно отключить, убрав соответствующий флажок слева от радиокнопок. Имя лог-файла формируется из текущей даты и времени начала записи, чем гарантируется его уникальность. При превышении числа записей 10000 автоматически создаётся новый файл лога.

Рассмотрим работу программы в режиме диалога. В программе имеется главное окно, в котором отображается лог общения пользователя с модулем SIM900, командная строка и кнопки для быстрого формирования AT-команд. Высоту главного окна можно изменять с помощью двух кнопок в правом верхнем углу (2). Имеется своеобразно оформленная справка, отображающаяся в белом квадрате правого нижнего угла при наведении указателя мыши на соответствующий элемент или кнопку программы. На скриншоте показан пример отображения справки при наведении курсора мыши на кнопку с командой AT+COPS=?. Справочные данные не указаны для кнопок команд вкладок от GPRS до FTP. Их описание есть в документации на модуль и следует ожидать появления в следующих версиях программы. Над командной строкой имеются кнопка формирования пустой АТ-команды и кнопки добавления в конец команды кодов перевода каретки и окончания строки(1). Ещё выше расположена строка для отображения содержимого командной строки в виде набора 16ричных чисел, которые будут отправлены в COM-порт после нажатия кнопки “Отправить”. Есть возможность выделения содержимого данной строки в целях дальнейшего копирования непосредственно из строки или из окна просмотра на соответствующей вкладке. Кнопка “Отправить” активизируется при удачном подключении к COM-порту в режиме “Диалог”. Состояние связи отображается в правом нижнем углу (3), настройка связи и подключение выполняется посредством пункта главного меню “Настройки”.

Ввод данных в командную строку можно формировать трёмя способами:

  1. Ручной набор;
  2. С помощью кнопок формирования готовых команд;
  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

Осциллограмма UART

Отличия работы программы в режиме диалога и сниффера следующие:

  1. Становится неактивным окно диалога, это сделано для того, чтобы случайно не передать фокус управления в данное окно, иначе считываемый лог будет крутиться только в одной строчке. Остаётся только наблюдать на бегущие строки процесса общения микроконтроллера с модулем.
  2. Становится неактивной кнопка “Отправить” – она тут не нужна. Функциональность всех остальных элементов сохраняется.

Считанный процесс общения так же сохраняется в лог-файле и его можно просмотреть:

Пример работы программы

Пример работы программы

Скриншот был намеренно заляпан, т.к. считывание выполнялось с коммерческого прибора.

Если строка полностью не умещается на всей длине окна, то её содержимое можно посмотреть на вкладке “ОКНО ПРОСМОТРА”, для этого нужно выделить интересующую строку в окне диалога. Так же имеется возможность копировать строку команды из окна диалога щелчком левой кнопки мыши для повторного использования в режиме “Диалог”. Признаком команды является присутствие символов AT в начале строки, выделение других строк не приводит к изменению содержимого командной строки.

Программа распространяется за спасибо 🙂

Скачать программу SIM900 DIALOG

14 комментариев »

Иван Абдулхаев | 17.04.2015 | Программы | 4 703 просмотров

14 комментариев на « Терминал для GSM модема SIM900 — SIM900 DIALOG»

  1. Николай пишет 16.10.2015 в 10:46 #

    Что вы! Какое там замечание, это наблюдение любителя. 🙂 Изменил вручную номе порта на 9-й и все завелось. Спасибо за софтинку!

  2. Влад пишет 21.12.2015 в 19:46 #

    Прога супер. Все заработало с первого раза. Но есть пару моментов:
    -АТ команда»Информация об ошибках» выглядит так «AT+CMEE=x», у вас «ATCME=x».
    — не приходит код ошибки в цифровом виде.

  3. Иван Абдулхаев пишет 21.12.2015 в 21:14 #

    Влад, во второй версии программы есть возможность редактирования команд, а тут получается очепатался немного 🙂

  4. Иван Абдулхаев пишет 21.12.2015 в 21:15 #

    Вторая версия с возможностью редактирования команд здесь http://alex-exe.ru/programm/gsm-dialog/

Комментарии RSS

Оставьте отзыв