Sim900 инструкция на русском языке

Чтобы управлять модемом SIM900, используются простые AT-команды. Для этого нужно модем SIM900 подключить к компьютеру. Если модем SIM900 собран самостоятельно, тогда нужно заранее позаботиться о наличии у него USB-разъема, с помощью которого можно подключиться к компьютеру. Что касается компьютера, то для коммуникации с модемом достаточно будет какой-либо терминальной программы. 

Для тех, кто не в курсе, модем или модуль SIM900 — это GSM-устройство, которое можно использовать для:

  • осуществления звонков;

  • отправки СМС;

  • отправки мультимедийных сообщений;

  • подключения к GPRS;

  • отправки электронных писем;

  • и др.

Модем SIM900 представляет собой плату, на которой основным компонентом является микропроцессор SIM900, отсюда и название модема, и множество дополнительных компонентов: разъемы, порты, антенны и др. Такой модем можно заказать в уже собранном виде, но многими умельцами практикуется его самостоятельная сборка на основе плат Arduino.

На практике модуль SIM900 активно интегрируется в интернет вещей, для того чтобы вы могли дистанционно управлять любыми устройствами «умного дома». По функциям модем SIM900 может выполнить практически все, что делает обычный мобильный телефон:

  • принимать и получать звонки;

  • отправлять и принимать сообщения;

  • выходить в интернет;

  • и др.

Для коммуникации с пользователями модем SIM900 использует четырехдиапазонную сеть GSM/GPRS, поэтому применять это устройство можно везде, где доступна «мобильная связь». Чтобы правильно настроить модем SIM900, нужно знать основные AT-команды, используемые для его программирования.

Модем SIM900: AT-команды для его программирования

АТ-команды нужны, чтобы выстроить «общение» с модемом SIM900. Алгоритм простой: вы отправляете устройству команду, а оно ее выполняет и отвечает. АТ-команды для модуля SIM900 представлены просто огромным списком, но сегодня мы приведем наиболее важные из них. Все используемые АТ-команды можно отнести к трем основным категориям на основе используемого синтаксиса:

  • «=?» задаем вопрос модулю и ожидаем от него ответ, поддерживает ли он эту команду, и если поддерживает, то с какими параметрами;

  • «?» задаем вопрос модулю и в ответ ожидаем параметры для отправленной команды;

  • «=» определяем новые значения для отправленной команды.

АТ-команды модема SIM900 для работы с портом:

  • «АТ+IPR?» проверяем скорость порта;

  • «АТ+ICF?» проверяем настройки передачи информации;

  • «АТ+IFC?» проверяем, происходит ли контроль передачи информации.

АТ-команды модуля SIM900 для получения информации о модеме:

  • «АТ+GSAP» проверяем, на что способен модем;

  • «АТ+GMM» запрашиваем идентификатор модема;

  • «АТ+GMR» запрашиваем идентификатор ревизии модема;

  • «АТ+GSN» запрашиваем IMEI устройства;

  • «АТ+СОРS?» запрашиваем информацию о сотовом операторе;

  • «АТ+COPS=?» проверяем список всех доступных сотовых операторов;

  • «АТ+CPAS» проверяем рабочее состояние модема;

  • «АТ+CREG?» проверяем состояние регистрации модема в сети;

  • «АТ+CSQ?» запрашиваем информацию об уровне сигнала;

  • «АТ+CCLK?» проверяем текущие настройки времени и даты в устройстве.

АТ-команды модема SIM900 для настройки звонков:

  • «АТ+CLIP=1 или 0» включение или выключение звонков, где «1» это включение, а «0» выключение;

  • «АТ+GSMBUSY=1 или 0» запрещаем или разрешаем входящие звонки, где «1» разрешаем, а «0» запрещаем;

  • «АТS0=0 или 1» настраиваем автоматический ответ на звонки, где «0» ручной ответ на звонки, а «1» автоматический ответ;

  • «АТD+хххххххххх;» звоним на номер «+хххххххххх»;

  • «ATDL» звоним на последний исходящий номер;

  • «АТА» отвечаем на входящий звонок;

  • «АТН0» сбрасываем входящий звонок или «вешаем трубку».

АТ-команды модема SIM900 для настройки SMS:

  • «АТ+CMGF=1 или 0» включаем или выключаем тестовый режим приема SMS, где «1» включаем, а «0» выключаем;

  • «АТ+СSCS=»GSM»» определяем кодировку текстового содержания, где можно использовать и другие кодировки: IRA, UCS2, HEX, РССР и др.;

  • «АТ+CSCB=0» разрешаем или запрещаем принимать специальные сообщения, где «0» запрещаем, а «1» разрешаем;

  • «АТ+CAUTORUN=1, «ххххххххххх»» включаем функцию «SMS Autorun», где «ххххххххххх» — это номер телефона, с которого можно отсылать АТ-команды, а модем их будет тут же исполнять;

  • «АТ+СМGS=»+хххххххххх»>текст сообщения» отправляем «текст сообщения» на номер «+хххххххххх»;

  • «АТ+CMGR=2» читаем входящие сообщения.

Прочие полезные АТ-команды для взаимодействия с модемом SIM900:

  • «АТ+СМЕЕ=0, 1 или 2», где «0» отключаем получение информации о возникающих ошибках в работе, «1» просим присылать код ошибки, «2» просим присылать описание ошибки;

  • «АТ+ССLK=»прописываем нужную дату и время»» — устанавливаем дату и время;

  • «АТ+СPIN»=ХХХХ — определяем ПИН-код для модема;

  • «ATZ0 или 1» сбрасываем настройки модема до определенного уровня, где «0» или «1» это профили (уровни) настроек модема;

  • «AT&F» сбрасываем настройки до заводских;

  • «АТ+HTTPSSL» подключение SSL для HTTP;

  • и др. 

Заключение

АТ-команды используются для настройки работы модема SIM900. Сегодня мы привели основные из команд, которые позволят сделать из вашего модема SIM900 устройство, похожее на сотовый телефон. Это удобно, когда вы подключаете SIM900 к компонентам «умного дома» и хотите взаимодействовать с ними через мобильную сеть.

  • Bookmarks

Quick Links

SIM90

Package

e contents:

SIM900A GS

SM MODEM 

DOCUMENT

TATION CD. 

Feature

es:

Supply powe

er: DC 9V to 

Onboard Fea

atures: 

1. O

Onboard Pow

2. O

Onboard indic

3. O

Onboard prov

manual) using

m

4. O

Onboard DB9

5. 3 

pin male he

m

microcontroll

6. O

Onboard Aud

7. O

Onboard PWM

All manuals and user guides at all-guides.com

00/900

0AGSM

with Antenn

na. 

12V (DC 9V t

typical) NOT

wer ON & Net

twork indica

cator LED &

buzzer for in

vision to sele

ect the powe

g the jumper

r with onboa

9 connector f

for connectin

eader (TTL) in

nterface for c

er. 

io (speaker a

and microph

M and ADC c

channels(SIM

M MO

ODEM

M

TE: Recomme

ended powe

r supply DC 

tor LED 

ncoming mes

ssage & call i

indication  

er on of SIM9

900A (either 

automatic o

ard switch fo

r manual PO

OWER‐ON. 

ng modem d

irectly to com

mputers seri

connecting S

SIM900 direc

ctly with 

hone) interfa

ce pins. 

M900A PWM 

and ADC PIN

NS) 

9V/3A  

or 

ial port. 

loading

Summary of Contents for SimCom SIM900

This manual is also suitable for:

Sim900a

Диалог происходит по средством AT команд. Мы шлём модулю нужную команду или запрос, а он её выполняет и отвечает. Самая простая команда AT, на которую модуль тут же ответит OK, если модуль подключен и исправен. Самые популярные команды рассмотрим далее.

Почти все команды имеют 3 режима:

  • тестовый =? – модуль ответит поддерживает ли он команду и возможные её параметры
  • чтение ? – ответом будет текущие параметры для этой команды
  • запись = записываем новые значения для команды.

A/ — повтор предыдущей команды

В статье, идёт речь о GSM модуле SIM900 (B09). Напоминаю, т.к. есть ещё и другие разновидности этого модуля и формат команд с ними может немного отличаться.

Управление портом

По умолчанию модуль настроен 9600 8N1, 9600 – скорость, 8 – бит в посылки, N – нет контроля чётности, 1- стоп бит.

Команда

Ответ

Описание

AT+IPR? +IPR: 0
OK
Скорость порта:
0 – автоматически
1200
2400
4800
9600
19200
38400
57600
115200
AT+ICF? +ICF: 3,3
OK
Настройки передачи.
Первый параметр:
Бит в посылке/чётность/стоп бит
1 – 8/0/2
2 – 8/1/1
3 – 8/0/1
4 – 7/0/2
5 – 7/1/1
6 – 7/0/1
Второй параметр – чётность:
0 – нечётный
1 – чётный
3 – нет
AT+IFC? +IFC: 0,0
OK
Контроль передачи данных
Первый параметр – терминалом от модуля
Второй параметр – модулем от терминала
0 – нет контроля
1 – программный
2 – аппаратный

Информация и состояние

Информация о модуле

Команда

Ответ

Описание

AT+GCAP +GCAP:+FCLASS,+CGSM
OK
Возможности модуля
AT+GMM SIMCOM_SIM900
OK
Идентификатор модуля
AT+GMR Revision:1137B09SIM900M64_ST
OK
Ревизия
AT+GSN 01322600XXXXXXX
OK
IMEI

Информация о состояние модуля

Команда

Ответ

Описание

AT+COPS? +COPS: 0,0,»MTS-RUS»
OK
Информация об операторе
AT+COPS=? +COPS: (2,»MTS RUS»,»»,»25001″),(1,»MOTIV»,»MOTIV»,»25035″),(1,»Utel»,»Utel»,»25039″),,(0,1,4),(0,1,2)
OK
Доступные операторы
AT+CPAS +CPAS: 0
OK
Информация о состояние модуля
0 – готов к работе
2 – неизвестно
3 – входящий звонок
4 – голосовое соединение
AT+CREG? +CREG: 0,1
OK
Тип регистрации сети
Первый параметр:
0 – нет кода регистрации сети
1 – есть код регистрации сети
2 – есть код регистрации сети + доп параметры
Второй параметр:
0 – не зарегистрирован, поиска сети нет
1 – зарегистрирован, домашняя сеть
2 – не зарегистрирован, идёт поиск новой сети
3 – регистрация отклонена
4 – неизвестно
5 – роуминг
AT+CSQ +CSQ: 17,0
OK
Уровень сигнала:
0 -115 дБл и меньше
1 -112 дБл
2-30 -110..-54 дБл
31 -52 дБл и сильнее
99 – нет сигнала.
AT+CCLK? +CCLK: «00/01/01,04:21:27+00»
OK
Текущая дата и время телефона.
AT+CBC +CBC: 0,95,4134
OK
Монитор напряжения питания модуля
Первый параметр:
0 – не заряжается
1 – заряжается
2 – зарядка окончена
Второй параметр:
1-100 % — уровень заряда батареи
Третий параметр:
Напряжение питание модуля (VBAT), мВ
AT+CADC? +CADC: 1,7
OK
Значение АЦП (до 2,8В)

Настройки

Вызовов

Команда

Ответ

Описание

AT+CLIP=1 OK АОН
1 – вкл / 0 – выкл
AT+GSMBUSY=0 OK Запрет входящих звонков
0 – разрешены
1 – запрещены
ATS0=0 OK Автоответ
0 – ручной
1-более – автомотический после заданного количества звонков

СМС

Команда

Ответ

Описание

AT+CMGF=1 OK Текстовый режим
1 – включить
0 – выключить
см. примечание
AT+CSCS= «GSM» OK Кодировка текстового режима
Доступны следующие кодировки:
IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1
см. примечание
AT+CSCB=0 OK Приём специальных сообщений
0 – разрешен (по умолчанию)
1 – запрещен

Остальные

Команда

Ответ

Описание

ATE0 OK ЭХО
1 – вкл (по умолчанию) / 0 – выкл
ATV1 OK Формат ответа модуля
0 – только ответ
1 – полный ответ с ЭХО (по умолчанию)
AT+CMEE=0 OK Информация об ошибках
0 – отключён (по умолчанию)
1 – код ошибки
2 – описание ошибки
AT+CCLK=»13/09/25,13:25:33+05″ OK Установка часов
«yy/mm/dd,hh:mm:ss+zz»
Где:
год/месяц/дата,
часы:минуты:секунды
+часовой пояс
AT+CPIN=XXXX   Ввод PIN кода
ATZ0   Сброс настроек до по умолчанию (не до заводских)
0 или 1 – выбор профиля
AT&F   Сброс настроек до заводских
AT&W OK Сохранение настроек для текущего профиля
Параметр 0 или 1 — выбор профиля
Параметр указывать сразу за командой (AT&W0)
AT+CPOWD=1 NORMAL POWER DOWN Выключение модуля
0 – срочное
1 – нормальное
AT+CFUN=1,1   Энергосберегающий режим и перезагрузка
Первый параметр:
0 – минимальный функционал
1 – нормальный режим (по умолчанию)
2 – выключения цепей приёма и передачи сигнала
Второй параметр:
0 – выполнить без перезагрузки
1 – перезагрузить (доступно только в нормальном режиме, т.е. параметры = 1,1)

Телефонные звонки

Команда

Ответ

Описание

ATD+790XXXXXXXX; OK Позвонить на номер +790XXXXXXXX;
NO DIALTONE
BUSY
NO CARRIER
NO ANSWER
Нет сигнала
Если вызов отклонён
Повесили трубку
Нет ответа
ATDL OK Позвонить по последнему исходящему номеру
ATA OK Ответить на звонок
ATH0 OK Повесить трубку/ разорвать соединение
  RING Входящий звонок
AT+CLIP=1 OK см. настройки
  RING

+CLIP: «+790XXXXXXXX»,145,»»,,»»,0

Входящий звонок с включенным АОН
Где:
Первый параметр – номер телефона входящего звонка
2 – тип входящего номера
129 – не определен
161 – национальный
145 – интернациональный
177 – сетевой, специальный

СМС

Команды приведены для текстового режима и в GSM кодировке.

Команда

Ответ

Описание

AT+CMGS=»+790XXXXXXXX»
>Test sms text
>
+CMGS: 15
OK
Отправка СМС.
Указываем номер получателя в кавычках и отправляем модулю с символом переноса строки (13 в ASCII).
После приглашения «>» вводим текст сообщения.
Для отправки в конце сообщения отправляем символ SUB (26 в ASCII) или ESC (27) для отмены.
AT+CMGF=1
AT+CSCS= «GSM»
  Режим и кодировка.
см. настройки и примечание
  +CMTI: «SM»,4 Уведомление о приходе СМС.
Второй параметр номер пришедшего СМС.
AT+CMGL=»REC UNREAD» +CMGL: 4,»REC UNREAD»,»+790XXXXXXXX»,»»,»13/09/24,23:02:22+24″
Test2.
OK
Чтение групп СМС.
Всего 5 групп:
REC UNREAD – входящие непрочитанные
REC READ – входящие прочитанные
STO UNSENT – Пользовательские непрочитанные
STO SENT – пользовательские прочитанные
ALL – прочитать все сообщения
AT+CMGR=2 +CMGR: «REC READ»,»+790XXXXXXXX»,»»,»13/09/21,11:57:46+24″
Test sms text
OK
Чтение SMS сообщений.
Запрос:
Первый параметр – номер сообщения.
Второй параметр (необязателен):
0 – обычный режим (по умолчанию)
1 – не изменять статус сообщения
Ответ:
Первый параметр – группа сообщений, см предыдущий пункт.
Второй параметр – номер отправителя
3 – дата отправки
Далее следует текс сообщения.
AT+CMGDA=»DEL SENT» OK Удаление групп СМС:
DEL READ — прочитанные
DEL UNREAD — не прочитанные
DEL SENT — отправленные
DEL UNSENT — не отправленные
DEL INBOX — полученные
DEL ALL — всех сообщения
AT+CMGD=4 OK Удаление СМС.
Первый параметр – номер сообщения
Второй параметр:
0 – удаление указанного сообщения (по умолчанию)
1 – удаление прочитанных сообщений
2 – удаление прочитанных и отправленных сообщений
3 – удаление прочитанных, отправленных и не отправленных сообщений
4 – удаление всех сообщений
AT+CSCA? +CSCA: «+79126313431»,145
OK
Возвращает номер сервис центра отправки сообщений.

Тоновый набор (DTMF)

Тоновые сигналы: 0-9,#,*,A-D

Команда

Ответ

Описание

AT+VTD=3 OK Длительность тоновых сигналов для AT+VTD.
Значение параметра 1..255
AT+VTS=»1,4,#,A,6,7,0″ OK Отправить последовательность тоновых сигналов (до 20).
Длительность задается командой AT+VTS.
AT+CLDTMF=7, «1,4,#,A,6,7,0» OK Проиграть на модуле (через аудио выход) тоновые сигналы.
Первый параметр — длительность 1-100
Второй параметр – строка тоновых сигналов, до 20.

AT+VTD и AT+VTS команды, как мне кажется, работаю не корректно. VTD – должна устанавливать длительность тонового сигнала, а не паузу между ними, в то время когда тоновый сигнал в AT+VTS проигрывается быстро.

USSD

Команды для текстового режима и в GSM кодировке.

Команда

Ответ

Описание

AT+CUSD=1,»#100#» OK
+CUSD: 0,»Balance:240,68r «,
USSD запрос
Первый параметр – режим обработки операции:
0 – выполнить запрос, ответ проигнорировать
1 – выполнить запрос, вернуть ответ
2 – отменить запрос
Второй параметр – запрос в кавычках.
ATD#100#; OK
+CUSD: 0,»Balance:240,68r «,
Упрощенный USSD запрос (работает только при GSM кодировке)

Отмечу, что есть 2 варианта USSD запроса: начиная с * и начиная с #. В первом варианте ответ приходит на русском языке, во втором в латинице, если оператор такой запрос поддерживает и не ответит так же, как и в первом случае.
Режим отображения такой же, как и для СМС.

Примечание по текстовому режиму и кодировке

От текстового режима (PDU или текстовый) и кодировки модуля зависит формат ввода номеров, USSD запросов, входящих и исходящих СМС.

Самый геморройный и универсальный вариант – это PDU режим, т.к. в нём можно без проблем отправлять и принимать любые текстовые данные, но из-за его «геморойности» рассматривать его не буду.

Самый простой вариант – GSM кодировка. В нём номера вводятся привычным цифровым методом, исходящие и исходящие сообщения, как СМС, так и USSD в латинице отображаются, как им и полагается. С кириллицей дела обстоят посложнее, модуль входящие сообщения с ней отображает в UNICOD, точнее в HEX значениях UNICOD. С исходящими сообщениями дела обстоят сложнее!

Второй вариант, посложнее – UCS2 кодировка. Входящие и исходящие сообщения, USSD запросы, номера телефонов в запросах – всё пишется в UNICOD. Упрощенные USSD запросы не работают.

Другие варианты мной плохо опробованы, но у них тоже всё идёт в своей кодировке.

Пример (номер телефона заменён на +79012345678, добавлены переносы):

Кодировка
и
режим

Запрос

Ответ

PDU AT+CMGR=2 +CMGR: 1,»»,38
07919720780110F0000B919710325476F800003190121
175644215D4F29C0E9AB7E72E50985DC6B7CAF8B24B5E07

OK

AT+CMGR=3 +CMGR: 1,»»,59
07919720780110F0000B919710325476F800083190122
185134228005400650073007400200073006D00730020
0032002E0020042204350441044200200441043C0441

OK

GSM AT+CMGR=2 +CMGR: «REC READ»,»+79012345678″,»»,»13/09/21,11:57:46+24″
Test sms text

OK

AT+CMGR=3 AT+CMGR=3
+CMGR: «REC READ»,»+79012345678″,»»,»13/09/21,12:58:31+24″
005400650073007400200073006D007300200032
002E0020042204350441044200200441043C0441

OK

AT+CUSD=1,»#100#» OK

+CUSD: 0,»Balance:240,68r «,

UCS2 AT+CMGR=2 +CMGR: «REC READ»,»002B0037003900300031
0032003300340035003600370038″,»»,»13/09/21,11:57:46+24″
005400650073007400200073006D0073002E0020
0061006C00650078002D006500780065002E00720075

OK

AT+CMGR=3 +CMGR: «REC READ»,»002B00370039003000310032
003300340035003600370038″,»»,»13/09/21,12:58:31+24″
005400650073007400200073006D007300200032
002E0020042204350441044200200441043C0441

OK

AT+CUSD=1,»00230031
003000300023″
OK

+CUSD: 0,»00420061006C0061006E00630065003A0032
00340030002C0036003800720020″,64

Текст сообщений выданного на запрос «AT+CMGR=3» — «Test sms 2. Тест смс»

Кратко о UNICODE

В юникоде символы кодируются в шестнадцатиричке записанной в текстовом виде, при этом первые 127 символов просто переводятся в HEX, а вот к кириллице добавляется 350h.

Пример: 1 – 0031, G – 0047, z — 007A, Ы — 042B, я — 044F

Программка для кодировки и раскодировки UNICODE – скачать.

В статье привёл значительную часть основных команд GSM модуля SIM900 из огромного списка поддерживаемых им. Для большинства задач все приведенные команды не будут нужны, а хватит только малой их части. В одной из следующих статьей рассмотрю, как пользоваться GPRS AT-командами и пример его использования на примере простенькой домашней сигнализации. Так же бы было интересно достать и посмотреть прошивку «All-in-One».

В предыдущей статье – GSM модем SIM900 – рассмотрели, как запаять данный модем. Сейчас разберемся, как его подключить к компьютеру и пообщаемся с ним по средством AT команд.

SIM900 подключенный к компьютеру

SIM900 подключенный к компьютеру

Начнём с подключения к компьютеру, т.к. с него проще всего вести диалог с модулем. В нём нет нечего сложного, если модуль собран по схеме приведенной в предыдущей статье или подобной. Берем любой преобразователь интерфейса, например cp2102, ft232, max232 и подключаем к USB или COM порту компьютера. Открываем любую терминальную программу, я же предпочитаю свою – AL Terminal (кстати, её версию обновил). На компьютере подключаемся к COM порту со скорость 9600 (по умолчанию для SIM900), к которому подключен модуль и общаемся. Если питать от компьютера, через преобразователь интерфейса, т.е. от USB порта компьютера, то подключаем толстым USB кабелем, т.к. рабочие токи модуля могут быть в районе полу ампера, а кратковременные пики могут достигать 2А. Для питания модуля от 5В перемычкой JUMP1 нужно подать питание через стабилизатор, а не шунтировать его. Если питать от батареи (3,2-4,7В), то шунтируем стабилизатор.

Диалог происходит по средством AT команд. Мы шлём модулю нужную команду или запрос, а он её выполняет и отвечает. Самая простая команда AT, на которую модуль тут же ответит OK, если модуль подключен и исправен.

Почти все команды имеют 3 режима:

  • тестовый =? – модуль ответит поддерживает ли он команду и возможные её параметры
  • чтение ? – ответом будет текущие параметры для этой команды
  • запись = записываем новые значения для команды.

A/ — повтор предыдущей команды

В статье, идёт речь о GSM модуле SIM900 (B09). Напоминаю, т.к. есть ещё и другие разновидности этого модуля и формат команд с ними может немного отличаться.

Управление портом

По умолчанию модуль настроен 9600 8N1, 9600 – скорость, 8 – бит в посылки, N – нет контроля чётности, 1- стоп бит.

Команда

Ответ

Описание

AT+IPR? +IPR: 0
OK
Скорость порта:
0 – автоматически
1200
2400
4800
9600
19200
38400
57600
115200
AT+ICF? +ICF: 3,3
OK
Настройки передачи.
Первый параметр:
Бит в посылке/чётность/стоп бит
1 – 8/0/2
2 – 8/1/1
3 – 8/0/1
4 – 7/0/2
5 – 7/1/1
6 – 7/0/1
Второй параметр – чётность:
0 – нечётный
1 – чётный
3 – нет
AT+IFC? +IFC: 0,0
OK
Контроль передачи данных
Первый параметр – терминалом от модуля
Второй параметр – модулем от терминала
0 – нет контроля
1 – программный
2 – аппаратный

Информация и состояние

Информация о модуле

Команда

Ответ

Описание

AT+GCAP +GCAP:+FCLASS,+CGSM
OK
Возможности модуля
AT+GMM SIMCOM_SIM900
OK
Идентификатор модуля
AT+GMR Revision:1137B09SIM900M64_ST
OK
Ревизия
AT+GSN 01322600XXXXXXX
OK
IMEI

Информация о состояние модуля

Команда

Ответ

Описание

AT+COPS? +COPS: 0,0,»MTS-RUS»
OK
Информация об операторе
AT+COPS=? +COPS: (2,»MTS RUS»,»»,»25001″),(1,»MOTIV»,»MOTIV»,»25035″),(1,»Utel»,»Utel»,»25039″),,(0,1,4),(0,1,2)
OK
Доступные операторы
AT+CPAS +CPAS: 0
OK
Информация о состояние модуля
0 – готов к работе
2 – неизвестно
3 – входящий звонок
4 – голосовое соединение
AT+CREG? +CREG: 0,1
OK
Тип регистрации сети
Первый параметр:
0 – нет кода регистрации сети
1 – есть код регистрации сети
2 – есть код регистрации сети + доп параметры
Второй параметр:
0 – не зарегистрирован, поиска сети нет
1 – зарегистрирован, домашняя сеть
2 – не зарегистрирован, идёт поиск новой сети
3 – регистрация отклонена
4 – неизвестно
5 – роуминг
AT+CSQ +CSQ: 17,0
OK
Уровень сигнала:
0 -115 дБл и меньше
1 -112 дБл
2-30 -110..-54 дБл
31 -52 дБл и сильнее
99 – нет сигнала.
AT+CCLK? +CCLK: «00/01/01,04:21:27+00»
OK
Текущая дата и время телефона.
AT+CBC +CBC: 0,95,4134
OK
Монитор напряжения питания модуля
Первый параметр:
0 – не заряжается
1 – заряжается
2 – зарядка окончена
Второй параметр:
1-100 % — уровень заряда батареи
Третий параметр:
Напряжение питание модуля (VBAT), мВ
AT+CADC? +CADC: 1,7
OK
Значение АЦП (до 2,8В)

Настройки

Вызовов

Команда

Ответ

Описание

AT+CLIP=1 OK АОН
1 – вкл / 0 – выкл
AT+GSMBUSY=0 OK Запрет входящих звонков
0 – разрешены
1 – запрещены
ATS0=0 OK Автоответ
0 – ручной
1-более – автомотический после заданного количества звонков

СМС

Команда

Ответ

Описание

AT+CMGF=1 OK Текстовый режим
1 – включить
0 – выключить
см. примечание
AT+CSCS= «GSM» OK Кодировка текстового режима
Доступны следующие кодировки:
IRA, GSM, UCS2, HEX, PCCP, PCDN, 8859-1
см. примечание
AT+CSCB=0 OK Приём специальных сообщений
0 – разрешен (по умолчанию)
1 – запрещен

Остальные

Команда

Ответ

Описание

ATE0 OK ЭХО
1 – вкл (по умолчанию) / 0 – выкл
ATV1 OK Формат ответа модуля
0 – только ответ
1 – полный ответ с ЭХО (по умолчанию)
AT+CMEE=0 OK Информация об ошибках
0 – отключён (по умолчанию)
1 – код ошибки
2 – описание ошибки
AT+CCLK=»13/09/25,13:25:33+05″ OK Установка часов
«yy/mm/dd,hh:mm:ss+zz»
Где:
год/месяц/дата,
часы:минуты:секунды
+часовой пояс
AT+CPIN=XXXX Ввод PIN кода
ATZ0 Сброс настроек до по умолчанию (не до заводских)
0 или 1 – выбор профиля
AT&F Сброс настроек до заводских
AT&W OK Сохранение настроек для текущего профиля
Параметр 0 или 1 — выбор профиля
Параметр указывать сразу за командой (AT&W0)
AT+CPOWD=1 NORMAL POWER DOWN Выключение модуля
0 – срочное
1 – нормальное
AT+CFUN=1,1 Энергосберегающий режим и перезагрузка
Первый параметр:
0 – минимальный функционал
1 – нормальный режим (по умолчанию)
2 – выключения цепей приёма и передачи сигнала
Второй параметр:
0 – выполнить без перезагрузки
1 – перезагрузить (доступно только в нормальном режиме, т.е. параметры = 1,1)

Телефонные звонки

Команда

Ответ

Описание

ATD+790XXXXXXXX; OK Позвонить на номер +790XXXXXXXX;
NO DIALTONE
BUSY
NO CARRIER
NO ANSWER
Нет сигнала
Если вызов отклонён
Повесили трубку
Нет ответа
ATDL OK Позвонить по последнему исходящему номеру
ATA OK Ответить на звонок
ATH0 OK Повесить трубку/ разорвать соединение
RING Входящий звонок
AT+CLIP=1 OK см. настройки
RING

+CLIP: «+790XXXXXXXX»,145,»»,,»»,0

Входящий звонок с включенным АОН
Где:
Первый параметр – номер телефона входящего звонка
2 – тип входящего номера
129 – не определен
161 – национальный
145 – интернациональный
177 – сетевой, специальный

СМС

Команды приведены для текстового режима и в GSM кодировке.

Команда

Ответ

Описание

AT+CMGS=»+790XXXXXXXX»
>Test sms. alex-exe.ru
>
+CMGS: 15
OK
Отправка СМС.
Указываем номер получателя в кавычках и отправляем модулю с символом переноса строки (13 в ASCII).
После приглашения «>» вводим текст сообщения.
Для отправки в конце сообщения отправляем символ SUB (26 в ASCII) или ESC (27) для отмены.
AT+CMGF=1
AT+CSCS= «GSM»
Режим и кодировка.
см. настройки и примечание
+CMTI: «SM»,4 Уведомление о приходе СМС.
Второй параметр номер пришедшего СМС.
AT+CMGL=»REC UNREAD» +CMGL: 4,»REC UNREAD»,»+790XXXXXXXX»,»»,»13/09/24,23:02:22+24″
Test2.
OK
Чтение групп СМС.
Всего 5 групп:
REC UNREAD – входящие непрочитанные
REC READ – входящие прочитанные
STO UNSENT – Пользовательские непрочитанные
STO SENT – пользовательские прочитанные
ALL – прочитать все сообщения
AT+CMGR=2 +CMGR: «REC READ»,»+790XXXXXXXX»,»»,»13/09/21,11:57:46+24″
Test sms. alex-exe.ru
OK
Чтение SMS сообщений.
Запрос:
Первый параметр – номер сообщения.
Второй параметр (необязателен):
0 – обычный режим (по умолчанию)
1 – не изменять статус сообщения
Ответ:
Первый параметр – группа сообщений, см предыдущий пункт.
Второй параметр – номер отправителя
3 – дата отправки
Далее следует текс сообщения.
AT+CMGDA=»DEL SENT» OK Удаление групп СМС:
DEL READ — прочитанные
DEL UNREAD — не прочитанные
DEL SENT — отправленные
DEL UNSENT — не отправленные
DEL INBOX — полученные
DEL ALL — всех сообщения
AT+CMGD=4 OK Удаление СМС.
Первый параметр – номер сообщения
Второй параметр:
0 – удаление указанного сообщения (по умолчанию)
1 – удаление прочитанных сообщений
2 – удаление прочитанных и отправленных сообщений
3 – удаление прочитанных, отправленных и не отправленных сообщений
4 – удаление всех сообщений
AT+CSCA? +CSCA: «+79126313431»,145
OK
Возвращает номер сервис центра отправки сообщений.

Тоновый набор (DTMF)

Тоновые сигналы: 0-9,#,*,A-D

Команда

Ответ

Описание

AT+VTD=3 OK Длительность тоновых сигналов для AT+VTD.
Значение параметра 1..255
AT+VTS=»1,4,#,A,6,7,0″ OK Отправить последовательность тоновых сигналов (до 20).
Длительность задается командой AT+VTS.
AT+CLDTMF=7, «1,4,#,A,6,7,0» OK Проиграть на модуле (через аудио выход) тоновые сигналы.
Первый параметр — длительность 1-100
Второй параметр – строка тоновых сигналов, до 20.

AT+VTD и AT+VTS команды, как мне кажется, работаю не корректно. VTD – должна устанавливать длительность тонового сигнала, а не паузу между ними, в то время когда тоновый сигнал в AT+VTS проигрывается быстро.

USSD

Команды приведены для текстового режима и в GSM кодировке.

Команда

Ответ

Описание

AT+CUSD=1,»#100#» OK
+CUSD: 0,»Balance:240,68r «,
USSD запрос
Первый параметр – режим обработки операции:
0 – выполнить запрос, ответ проигнорировать
1 – выполнить запрос, вернуть ответ
2 – отменить запрос
Второй параметр – запрос в кавычках.
ATD#100#; OK
+CUSD: 0,»Balance:240,68r «,
Упрощенный USSD запрос (работает только при GSM кодировке)

Отмечу, что есть 2 варианта USSD запроса: начиная с * и начиная с #. В первом варианте ответ приходит на русском языке, во втором в латинице, если оператор такой запрос поддерживает и не ответит так же, как и в первом случае.
Режим отображения такой же, как и для СМС.

Примечание по текстовому режиму и кодировке

От текстового режима (PDU или текстовый) и кодировки модуля зависит формат ввода номеров, USSD запросов, входящих и исходящих СМС.

Самый геморройный и универсальный вариант – это PDU режим, т.к. в нём можно без проблем отправлять и принимать любые текстовые данные, но из-за его «геморойности» рассматривать его не буду.

Самый простой вариант – GSM кодировка. В нём номера вводятся привычным цифровым методом, исходящие и исходящие сообщения, как СМС, так и USSD в латинице отображаются, как им и полагается. С кириллицей дела обстоят посложнее, модуль входящие сообщения с ней отображает в UNICOD, точнее в HEX значениях UNICOD. С исходящими сообщениями дела обстоят сложнее!

Второй вариант, посложнее – UCS2 кодировка. Входящие и исходящие сообщения, USSD запросы, номера телефонов в запросах – всё пишется в UNICOD. Упрощенные USSD запросы не работают.

Другие варианты мной плохо опробованы, но у них тоже всё идёт в своей кодировке.

Пример (номер телефона заменён на +79012345678, добавлены переносы):

Кодировка
и
режим

Запрос

Ответ

PDU AT+CMGR=2 +CMGR: 1,»»,38
07919720780110F0000B919710325476F800003190121
175644215D4F29C0E9AB7E72E50985DC6B7CAF8B24B5E07

OK

AT+CMGR=3 +CMGR: 1,»»,59
07919720780110F0000B919710325476F800083190122
185134228005400650073007400200073006D00730020
0032002E0020042204350441044200200441043C0441

OK

GSM AT+CMGR=2 +CMGR: «REC READ»,»+79012345678″,»»,»13/09/21,11:57:46+24″
Test sms. alex-exe.ru

OK

AT+CMGR=3 AT+CMGR=3
+CMGR: «REC READ»,»+79012345678″,»»,»13/09/21,12:58:31+24″
005400650073007400200073006D007300200032
002E0020042204350441044200200441043C0441

OK

AT+CUSD=1,»#100#» OK

+CUSD: 0,»Balance:240,68r «,

UCS2 AT+CMGR=2 +CMGR: «REC READ»,»002B0037003900300031
0032003300340035003600370038″,»»,»13/09/21,11:57:46+24″
005400650073007400200073006D0073002E0020
0061006C00650078002D006500780065002E00720075

OK

AT+CMGR=3 +CMGR: «REC READ»,»002B00370039003000310032
003300340035003600370038″,»»,»13/09/21,12:58:31+24″
005400650073007400200073006D007300200032
002E0020042204350441044200200441043C0441

OK

AT+CUSD=1,»00230031
003000300023″
OK

+CUSD: 0,»00420061006C0061006E00630065003A0032
00340030002C0036003800720020″,64

Текст сообщений выданного на запрос «AT+CMGR=3» — «Test sms 2. Тест смс»

Кратко о UNICOD.

В юникоде символы кодируются в шестнадцатиричке записанной в текстовом виде, при этом первые 127 символов просто переводятся в HEX, а вот к кириллице добавляется 350h.

Пример: 1 – 0031, G – 0047, z — 007A, Ы — 042B, я — 044F

Для кодировки и раскодировки UNICOD на скорую руку была написана небольшая программка – скачать .

В статье привёл значительную часть основных команд GSM модуля SIM900 из огромного списка поддерживаемых им. Для большинства задач все приведенные команды не будут нужны, а хватит только малой их части. В одной из следующих статьей рассмотрю, как пользоваться GPRS AT-командами и пример его использования на примере простенькой домашней сигнализации. Так же бы было интересно достать и посмотреть прошивку «All-in-One».

Так же может быть интересно:

  • GSM модем M10
  • GSM модем FARGO MAESTRO 100
  • GSM модем Siemens MC35i
  • Документация на GSM модемы SIMCOM

Статья обновлена 2 октября 2013 года

Время на прочтение
9 мин

Количество просмотров 150K

Не так давно друг предложил мне работу, связанную с созданием прошивки для микроконтроллера, который должен был связываться с сервером при помощи GSM-модуля SIM900D. Ранее я с программированием микроконтроллеров дела не имел, да и на C программировал последний раз в студенческие времена, но любопытство перевесило и я принялся за работу. Документация по данной железке присутствует в интернете, однако хороших примеров работы с TCP/IP в коде найти не удалось. Ничего не оставалось, кроме как обложиться документацией, запастись сигаретами и чаем и приступить к лавированию между граблями. А граблей оказалось немало. Собственно, поэтому я и написал эту статью — чтобы другим было легче.

Далее будет много AT-команд, не слишком много кода и очень много букв.

Что было нужно

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

Что получилось в итоге

Получился код на C, который может все, что было нужно. Из-за требований компактности, разбирать ответы и генерировать строки пришлось при помощи своего кода, который даже стыдно показать честному народу. Поэтому рекомендую всем использовать для этих целей регулярные выражения. Свой код я тоже собираюсь перевести на легковесный движок регулярных выражений, но уже после создания полнофункциональной прошивки.

Код требует функций/макросов для работы с последовательным портом, а также наличия функций memset и memcpy. Так что его с относительной легкостью можно перенести на другую платформу, не зацепив по пути кучу библиотек.

И как оно выглядит?

Программирование и тестирование проводилось под Windows 7. Код, полученный в результате, стал основным материалом для этой статьи. Я не стану приводить код полностью и комментировать его, а вместо этого покажу алгоритм настройки и работы с GSM-модулем.

Функции, которые требуются коду:

  • uint16_t init_serial_port(char *port_name) Эта функция настраивает указанный последовательный порт. Под Windows.
  • uint16_t puts_serial(uint8_t *buffer, uint16_t size) А эта пишет строку байт в этот порт.
  • gets_serial(uint8_t *buffer, uint16_t size) Эта, соответственно, читает строку байт из последовательного порта.

Функции, которые код предоставляет:

  • init_gprs() & stop_gprs() Соответственно инициализируют и вырубают GSM-модуль.
  • uint16_t connect_gprs(uint8_t index, uint8_t mode, char *address, char *port) Устанавливает подключение с сервером. Стоит отметить, что модуль умеет работать с протоколами TCP и UDP как в качестве клиента, так и будучи клиентом. Поддерживается максимум 8 одновременных подключений.
  • uint16_t close_gprs(uint8_t index) Закрывает указанное подключение.
  • uint16_t send_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Отправка сообщения через указанное подключение.
  • uint16_t recv_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Получение сообщения. Неблокирующая функция, что значит она не будет ждать появления данных в потоке, а вернет управление, если получать нечего. Стоит отметить, что такое поведение реализовать проще, чем блокирующее.

Как работать с последовательным портом

Это достаточно просто. Под целевой микроконтроллер есть макросы для отправки/получения данных через USART, но так как отлаживать такой код проще со стационарного компьютера, мне была предоставлена связка из переходника USB<->USART и GSM-модуля. Оставалось только научиться работать с последовательным портом под Windows. Это оказалось просто. Вкратце, последовательный порт представляется в ОС обычным файлом, передача информации осуществляется функциями ReadFile и WriteFile. Нужно только установить кое-какие параметры при помощи функций SetCommTimeouts и SetCommState.

Вот как выглядит функция инициализации порта:

uint16_t init_serial_port(char *port_name)
{
    COMMTIMEOUTS timeouts;
    DCB parameters;
    int result;

    serial_port_handle = CreateFile(port_name, // "\\\\.\\COMx"
                                    GENERIC_READ | GENERIC_WRITE,
                                    0, // Значения последующих параметров фиксированы при работе с портом
                                    NULL, 
                                    OPEN_EXISTING,
                                    0,
                                    NULL);

    if (serial_port_handle == INVALID_HANDLE_VALUE)
    {
        printf("Error opening a serial port!\n");

        return 1;
    }

    // Максимальное время между чтением двух байт подряд
    timeouts.ReadIntervalTimeout         = 100;
    // Следующее значение умножается на количество читаемых из порта символов
    timeouts.ReadTotalTimeoutMultiplier  = 0;
    // и прибавляется к этому значению, получается максимальное время на выполнение 
    // всей операции 
    timeouts.ReadTotalTimeoutConstant    = 1000;
    // Значение то же, что и у предыдущих двух параметров, однако таймаут считается на запись.
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant   = 1000;
    result = SetCommTimeouts(serial_port_handle, &timeouts);

    if (result == 0)
    {
        printf("Error setting timeouts for serial port!\n");
        close_serial_port();

        return 1;
    }

    // В параметры порта занесены самые простые настройки - без контроля
    // четности, без управления потоком, 1 стоп-бит.
    memset(&parameters,0,sizeof(parameters));
    parameters.DCBlength = sizeof(DCB);
    GetCommState(serial_port_handle, &ampparameters);
    parameters.BaudRate         = (DWORD)BAUD_RATE;
    parameters.ByteSize         = 8;
    parameters.Parity           = NOPARITY;
    parameters.StopBits         = ONESTOPBIT;
    parameters.fAbortOnError    = TRUE;
    parameters.fDtrControl      = DTR_CONTROL_DISABLE;
    parameters.fRtsControl      = RTS_CONTROL_DISABLE;
    parameters.fBinary          = TRUE;
    parameters.fParity          = FALSE;
    parameters.fOutX            = FALSE;
    parameters.fInX             = FALSE;
    parameters.XonChar          = (uint8_t)0x00;
    parameters.XoffChar         = (uint8_t)0xff;
    parameters.fErrorChar       = FALSE;
    parameters.fNull            = FALSE;
    parameters.fOutxCtsFlow     = FALSE;
    parameters.fOutxDsrFlow     = FALSE;
    parameters.XonLim           = 128;
    parameters.XoffLim          = 128;
    result = SetCommState(serial_port_handle, &ampparameters);

    if (result == 0)
    {
        printf("Error setting serial port parameters!\n");
        close_serial_port();

        return 1;
    }

    return 0;
}

Как происходит общение с GSM-модулем

После того, как последовательный порт настроен, в него можно отправлять AT-команды. Первой командой должна быть последовательность "AT\r", позволяющая модулю автоматически настроить скорость передачи по последовательному порту. Ответ, который можно получить после этого из порта, будет выглядеть как "AT\r\r\nOK\r\n".

Команда является простой строкой из ASCII-символов. Чтобы команду воспринял модуль, в ее конце нужно поставить символ перевода каретки "\r". В ответ модуль передаст строку символов, состоящую из двух частей — команды, на которую модуль отвечает и отделенным от нее символами «\r\r\n» ответом, заканчивающимся символами "\r\n". Чтобы было удобнее разбирать ответы я создал макрос, который устанавливает указатель на начало ответа в принимающем буфере. Если хочется вывести ответ в консоль, нужно добавить нулевой символ в конец принятого сообщения.

void at_send(char *cmd, uint16_t size)
{
    uint16_t result;

    cmd[size - 1] = '\r';
    result = puts_serial(cmd, size);

    return;
}

uint16_t at_recv(uint8_t *buffer, uint16_t size)
{
    uint16_t result;

    result = gets_serial(buffer, size);

    return result;
}

Примерно так и выглядят вспомогательные функции для отправки команды и получения ответа.

Инициализация модуля

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

  • "AT+CPIN=pin-code" Как несложно догадаться, эта команда разблокирует SIM-карту путем ввода пин-кода. Чтобы проверить, требуется ли пин-код, можно использовать команду "AT+CPIN?".
  • "AT+CREG?" Эта команда возвращает статус регистрации модуля в сети. Нужно выполнять ее, пока модуль не ответит, что в сети он зарегистрирован.
  • "AT+CGATT=1" Заставляет модуль подключиться к GPRS. Проверить, подключен ли он, можно командой "AT+CGATT?".
  • "AT+CIPRXGET=1" Включает получение данных, переданных через соединение, вручную. По умолчанию этот параметр отключен и данные передаются в последовательный порт сразу после получения. Это не слишком удобно, хотя и не критично — можно настроить модуль так, чтобы вместе с данными он передавал и заголовки IP, по которым можно определить, от кого был получен пакет. Я решил, что вручную данные получать проще и не ошибся. Как я понял, данная команда воспринимается только GSM-модулями SIM.COM.
  • "AT+CIPMUX=1" По умолчанию модуль может устанавливать только одно подключение. Этот параметр включает возможность создавать несколько подключений. Отправка и прием данных будут отличаться только на один параметр — индекс подключения.
  • "AT+CSTT="internet"" APN — Access Point Name, имя точки доступа для GPRS. Для моего провайдера выглядит именно так.
  • "AT+CIICR" Устанавливает беспроводное подключение GPRS. Может занять некоторое время, так что ее нужно выполнять в цикле и проверять ответ.
  • "AT+CIFSR" Возвращает IP-адрес модуля. Я использую ее чтобы проверить, подключен ли модуль к интернету.
  • "AT+CDNSCFG="8.8.8.8","8.8.4.4"" Этой командой устанавливаются сервера DNS, которые будет использовать модуль.
  • "AT+CIPSTATUS" Помимо данных о состоянии подключений эта команда дает информацию о том, готов ли модуль к установке соединений. Так что нужно проверить ее ответ.

После выполнения этих команд модуль будет готов к работе. Ну или не будет. Тут уж как повезет.

Установка и разрыв подключений

Создание подключения производится командой "AT+CIPSTART=index,"mode","address","port"".

  • index указывает порядковый номер подключения, может принимать значения от 0 до 7.
  • mode определяет протокол, который будет использоваться соединением. Может быть «TCP» или «UDP».
  • address задает адрес сервера. Если при настройке были указаны DNS-сервера, то можно использовать как IP-адрес, так и доменное имя.
  • port задает порт сервера, с которым будет устанавливаться соединение.

Замечу, что при использовании протокола UDP по умолчанию датаграммы будут отсылаться и приниматься только с одного адреса. Для того, чтобы использовать UDP на полную катушку и отсылать/принимать данные с любых адресов, можно использовать так называемый расширенный режим UDP, настраиваемый командой "AT+CIPUDPMODE". За подробностями отсылаю к документации.

В ответ на команду можно получить несколько вариантов ответов. Если все хорошо, то после стандартного "OK" через небольшой промежуток времени можно получить один из трех ответов:

  • "index,ALREADY CONNECT" это значит, что подключение с заданным индексом уже установлено и стоит его поискать.
  • "index,CONNECT OK" тут все очевидно.
  • "index,CONNECT FAIL" означает, что возникли проблемы с установкой соединения.

Разорвать соединение можно командой "AT+CIPCLOSE=index". Разорвать все соединения и деактивировать интерфейс GPRS можно командой "AT+CIPSHUT".

Передача данных

Данные передаются командой "AT+CIPSEND=index,length", где index указывает подключение, по которому нужно передать данные, а length задает длину пакета данных. Кстати, узнать MTU для каждого подключения можно при помощи команды "AT+CIPSEND=?".

Если все хорошо, то модуль в ответ на команду выдаст приглашение ">", после которого нужно переслать в последовательный порт данные. Как только модуль получит количество байт, равное length, он скажет что-то типа "index,SEND OK". Вообще, можно не использовать параметр length, однако в таком случае окончание пакета данных должно быть указано явно при помощи символа 0x1A, в терминале сочетание Ctrl+Z. Для передачи произвольных данных такой вариант, очевидно, не подходит.

Как видите, передача данных — процесс не слишком сложный. Поэтому переходим к самому интересному — приему данных.

Прием данных

Как только GSM-модуль принимает данные, он сигнализирует об этом, посылая в последовательный порт строку вида "+CIPRXGET:1,index\r\n". Я честно не знаю, что означает единица, ибо данная функция модуля документирована достаточно слабо, но у меня она фигурирует во всех сообщениях о приеме пакета.

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

Так вот, принимать данные можно командой "AT+CIPRXGET=2,index,length". Двойка означает режим приема, в данном случае байты просто высыпаются в последовательный порт. Можно также задать получение данных в виде HEX-текста, видимо, ради предотвращения конфликтов с программным управлением потоком. Мне это не потребовалось, ибо управление потоком я вообще не использую. Параметр length задает размер пакета данных, который мы желаем получить за один раз.

В ответ мы получим нечто вида "+CIPRXGET:2,index,received,excess\r\n__DATA__\r\nOK\r\n". В поле received будет находиться количество байт, находящихся в пакете данных __DATA__, а поле excess будет содержать количество байт, ожидающих своей очереди в буфере модуля. Так что если поле received равно нулю, можно с чистой совестью заявлять, что получать нечего. Собственно, пользуясь этим, я и реализовал неблокирующую функцию для приема данных.

В заключение

Настоятельно рекомендую перед написанием кода освоиться в AT-командах при помощи PuTTY, который прекрасно работает с последовательным портом.

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

Понравилась статья? Поделить с друзьями:
  • Simecti biotic инструкция на русском
  • Simbilac forte инструкция по применению
  • Simatic v20 инструкция на русском
  • Silymarin complex инструкция по применению на русском языке
  • Simat водонагреватель 10л инструкция по применению