snifer

[原创]GPRS 无线通信模块的实现案例

0
阅读(3178)

UP-TECH GPRS 模块采用的GPRS 模块型号为SIM300,是SIMCOM 公司推出的GSM/GPRS 双频模块,主要为语音传输、短消息和数据业务提供无线接口。SIM300 集成了完整的射频电路和GSM 的基带处理器,适合于开发一些GSM/GPRS 的无线应用产品,如移动电话、PCMCIA 无线MODEM 卡、无线POS 机、无线抄表系统以及无线数据传输业务,应用范围十分广泛,我今天就给大家演示一下这款设备的使用案例!


SIM300 为用户提供了功能完备的系统接口。60Pin 系统连接器是SIM300 与应用系统的连接接口,主要提供外部电源、RS-232 串口、SIM 卡接口和音频接口。SIM300 模块使用锂电池、镍氢电池或者其他外部直流电源供电,电源电压范围为:3.3V~4.6V,电源应该具有至少2A 的峰值电流输出能力。注意SIM300 的下列引脚:
VANA 为模拟输出电压,可提供2.5V 的电压和50mA 的电流输出,用于给音频电路提供电源。
VEXT 为数字输出电压,可提供2.8V 的电压和50mA 的电流输出。
VRTC 为时钟供电输入,当模块断电后为内部RTC 提供电源, 可接一个2.0V 的钮扣充电电池。
模块需要单独的 5V2A 的直流电源供电,经过芯片MIC29302 稳压后得到4.2V 电压供给GPRS 模块。
SIM300 提供标准的RS-232 串行接口,用户可以通过串行口使用AT 命令完成对模块的操作。串行口支持以下通信速率:
300,1200,2400,4800,9600,19200,38400,57600,115200(起始默认)
当模块上电启动并报出 RDY 后,用户才可以和模块进行通信,用户可以首先使用模块默认速率115200 与模块通信,并可通过AT+IPR=<rate>命令自由切换至其它通信速率。在应用设计中,当MCU需要通过串口与模块进行通讯时,可以只用三个引脚:TXD,RXD 和GND。其他引脚悬空,建议RTS和DTR 置低。本扩展板上采用MAX3232 芯片完成GPRS 模块的TTL 电平到RS232 电平的转换,以能和ARM 开发平台的RS232 串口连接。
SIM300 模块提供了完整的音频接口,应用设计只需增加少量外围辅助元器件,主要是为MIC 提供工作电压和射频旁路。音频分为主通道和辅助通道两部分。可以通过AT+CHFA 命令切换主副音频通道。音频设计应该尽量远离模块的射频部分,以降低射频对音频的干扰。本扩展板硬件支持两个语音通道,主通道可以插普通电话机的话柄,辅助通道可以插带MIC 的耳幔。

AT 指令集
GPRS 模块和应用系统是通过串口连接的,控制系统可以发给GPRS 模块AT 命令的字符串来控制其行为。GPRS 模块具有一套标准的AT 命令集,包括一般命令、呼叫控制命令、网络服务相关命令、电话本命令、短消息命令、GPRS 命令等。详细信息请参考SIM300 AT 指令集的应用文档。用户可以直接将扩展板和计算机串口相连,打开超级终端并正确设置端口和如下参数:波特率设为115200,数据位为8,关闭奇偶校验,数据流控制采用硬件方式,停止位为1。然后可以在超级终端里输入“AT”并回车,即可看到GPRS 模块回显一个“AT”,此时证明与GPRS 模块通讯正常。

下面给大家首先介绍一下基本的概念,其中尤为重要的是这几个函数,需要看懂。
(1) 一般命令

AT 命令字符串功能描述
AT+CGMI 返回生产厂商标识
AT+CGMM 返回产品型号标识
AT+CGMR 返回软件版本标识
ATI 发行的产品信息
ATE <value> 决定是否回显输入的命令。value=0 表示关闭回显,1 打开回显。
AT+CGSN 返回产品序列号标识
AT+CLVL? 读取受话器音量级别
AT+CLVL=<level> 设置受话器音量级别,level 在0~100 之间,数值越小则音量越轻。
AT+CHFA=<state> 切换音频通道。State=0 为主音频通道,1 为辅助音频通道。
AT+CMIC=<ch>,<gain> 改变MIC 增益,ch=0 为主MIC,1 为辅助MIC;gain 在0~15 之间。
(2) 呼叫控制命令
ATDxxxxxxxx; 拨打电话号码xxxxxxxx,注意最后要加分号,中间无空格。
ATA 接听电话
ATH 拒接电话或挂断电话
AT+VTS=<dtmfstr> 在语音通话中发送DTMF 音,dtmfstr 举例:“4,5,6”为456 三字符。
(3) 网络服务相关命令
AT+CNUM=? 读取本机号码。
AT+COPN 读取网络运营商名称
AT+CSQ 信号强度指示,返回接收信号强度指示值和信道误码率。
(4) 短消息命令
AT+CMGF=<mode> 选择短消息格式。mode=0 为PDU 模式,1 为文本模式。建议文本模式。
AT+CSCA? 读取短消息中心地址。
AT+CMGL=<stat> 列出当前短消息存储器中的短信。stat 参数空白为收到的未读短信。
AT+CMGR=<index> 读取短消息。index 为所要读取短信的记录号。
AT+CMGS=xxxxxxxx‘CR’ Text ‘CTRL+Z’ 发送短消息。xxxxxxxx 为对方手机号码,回车后接着输入短信内容,
然后按CTRL+Z 发送短信。CTRL+Z 的ASCII 码是26。
AT+CMGD=<index> 删除短消息。index 为所要删除短信的记录号。
本实验的目的是通过UP-Magic 平台串口1 控制 GPRS 模块,以实现拨打电话和发送短信的功能,结合前面介绍的串口通讯以及AT 指令,配合基于Qt 的用户UI 设计完成本实验。
拨打电话的命令是“ATDxxxxxxxx;”,ATD 命令后是所拨打的电话号码,以“;”号结束。模块默认的声音通道为主通道,如有需要可以使用“AT+CHFA=1”切换为辅助音频通道。
在这里短消息格式采用文本模式,发送短信前先使用“AT+CMGF=1”将短消息格式设置为文本模式,随后用“AT+CMGS=xxxxxxxx‘CR’ Text ‘CTRL+Z’”发送短信。

关键的系统构造函数:
Gprs::Gprs()
{
ui.setupUi(this);// 建立UI 工程界面
QPalette p;
p.setBrush(QPalette::Background,QBrush(QPixmap("/mnt/nfs/TEST-QT4/qt_2.6/images/call.png")
));
ui.key_sendmsg->setPalette(p);
// 进行相应控件信号与槽函数的连接
QObject::connect(ui.key_0, SIGNAL(clicked()), this, SLOT(doKey0()));
//connect(key_0, SIGNAL(clicked()), this, SLOT(doKey0()));
QObject::connect(ui.key_1, SIGNAL(clicked()), this, SLOT(doKey1()));
QObject::connect(ui.key_2, SIGNAL(clicked()), this, SLOT(doKey2()));
QObject::connect(ui.key_3, SIGNAL(clicked()), this, SLOT(doKey3()));
QObject::connect(ui.key_4, SIGNAL(clicked()), this, SLOT(doKey4()));
QObject::connect(ui.key_5, SIGNAL(clicked()), this, SLOT(doKey5()));
QObject::connect(ui.key_6, SIGNAL(clicked()), this, SLOT(doKey6()));
QObject::connect(ui.key_7, SIGNAL(clicked()), this, SLOT(doKey7()));
QObject::connect(ui.key_8, SIGNAL(clicked()), this, SLOT(doKey8()));
QObject::connect(ui.key_9, SIGNAL(clicked()), this, SLOT(doKey9()));
QObject::connect(ui.key_star, SIGNAL(clicked()), this, SLOT(doKeyStar()));
QObject::connect(ui.key_cross, SIGNAL(clicked()), this, SLOT(doKeyCross()));
QObject::connect(ui.key_clr, SIGNAL(clicked()), this, SLOT(doKeyClr()));
QObject::connect(ui.key_call, SIGNAL(clicked()), this, SLOT(doKeyCall()));
QObject::connect(ui.key_hang, SIGNAL(clicked()), this, SLOT(doKeyHang()));
QObject::connect(ui.key_rcv, SIGNAL(clicked()), this, SLOT(doKeyRcv()));
//QObject::connect(ui.key_clrmsg, SIGNAL(clicked()), ui.lineEdit2, SLOT(clear())); // by
sprife
QObject::connect(ui.key_sendmsg, SIGNAL(clicked()), this, SLOT(doKeySendMsg()));
QObject::connect(ui.key_quit, SIGNAL(clicked()), this, SLOT(goodBye()));
// 设置GPRS 模块串口通讯速率
baud = B115200; // uart boudrate
// 初始化串口通讯设备
tty_init();
}

AT 指令拨打电话子函数:
void Gprs::gprs_call(char *number, int num)
{
tty_write("atd", strlen("atd"));
tty_write(number, num);
tty_write(";\r", strlen(";\r"));
usleep(200000);
}
AT 指令接收电话子函数:
void Gprs::gprs_ans()
{
tty_writecmd("at", strlen("at"));
tty_writecmd("ata", strlen("ata"));
}
AT 指令挂断电话子函数:
void Gprs::gprs_hold()
{
tty_writecmd("at", strlen("at"));
tty_writecmd("ath", strlen("ath"));
}
AT 指令发送短信息子函数:
void Gprs::gprs_msg(char *number, int num)
{
char ctl[]={26,0};
// char *text=(char *)malloc(targetNum->text().length());
char *text=(char *)malloc(ui.lineEdit2->toPlainText().length());
sprintf(text,"%s",ui.lineEdit2->toPlainText().toLocal8Bit().data()); // by
sprife
//ui.lineEdit2->toHtml().toLocal8Bit().data()
qWarning("[msg]%s[len]%d",text,ui.targetNum->text().length());
// char text[]="Welcome to use up-tech embedded platform!";
tty_writecmd("at", strlen("at"));
usleep(5000);
tty_writecmd("at", strlen("at"));
tty_writecmd("at+cmgf=1", strlen("at+cmgf=1"));
tty_write("at+cmgs=", strlen("at+cmgs="));
tty_write("\"", strlen("\""));
tty_write(number, strlen(number));
tty_write("\"", strlen("\""));
tty_write(";\r", strlen(";\r"));
tty_write(text, strlen(text));
tty_write(ctl, 1);
usleep(300000);

代码普及就写这些,下面我会写如何使用这些代码,夏天来了,大家准备好了嘛?