GPRS通讯程序编码练习1练习目的z了解GPRS通讯原理;z掌握AT指令集中常用的AT指令的意义;z掌握GPRS发送短信、接打电话等程序的实现方法。2练习内容z调试gprs程序示例,了解gprs初始化,以及拨打电话的实现方法。z编写gprs通讯程序,实现拨打、接听、挂断电话,以及发送端信息。3练习原理3.1GPRS模块SIM100-E电器特性ARM嵌入式开发平台的GPRS扩展板采用的GPRS模块型号为SIM100-E,是SIMCOM公司推出的GSM/GPRS双频模块,主要为语音传输、短消息和数据业务提供无线接口。SIM100-E集成了完整的射频电路和GSM的基带处理器,适合于开发一些GSM/GPRS的无线应用产品,如移动电话、PCMCIA无线MODEM卡、无线POS机、无线抄表系统以及无线数据传输业务,应用范围十分广泛。SIM100-E模块为用户提供了功能完备的系统接口。60Pin系统连接器是SIM100-E模块与应用系统的连接接口,主要提供外部电源、RS-232串口、SIM卡接口和音频接口。SIM100-E模块使用锂电池、镍氢电池或者其他外部直流电源供电,电源电压范围为:3.3V~4.6V,电源应该具有至少2A的峰值电流输出能力。SIM100-E提供标准的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串口连接。SIM100-E模块提供了完整的音频接口,应用设计只需增加少量外围辅助元器件,主要是为MIC提供工作电压和射频旁路。音频分为主通道和辅助通道两部分。可以通过AT+CHFA命令切换主副音频通道。音频设计应该尽量远离模块的射频部分,以降低射频对音频的干扰。本扩展板硬件支持两个语音通道,主通道可以插普通电话机的话柄,辅助通道可以插带MIC的耳幔。当选择为主通道时,有电话呼入时板载蜂鸣器将发出铃声以提示来电。但选择辅助通道时来电提示音乐只能在耳机中听到。蜂鸣器是由GPRS模块的BUZZER引脚加驱动电路控制的。GPRS模块的射频部分支持GSM900/DCS1800双频,为了尽量减少射频信号在射频连接线上的损耗,必须谨慎选择射频连线。应采用GSM900/DCS1800双频段天线,天线应满足阻抗50欧姆和收发驻波比小于2的要求。为了避免过大的射频功率导致GPRS模块的损坏,在模块上电前请确保天线已正确连接。模块支持外部SIM卡,可以直接与3.0VSIM卡或者1.8VSIM卡连接。模块自动监测和适应SIM卡类型。对用户来说,GPRS模块实现的就是一个移动电话的基本功能,该模块正常的工作是需要电信网络支持的,需要配备一个可用的SIM卡,在网络服务计费方面和普通手机类似。3.2AT命令集简要说明GPRS模块和应用系统是通过串口连接的,控制系统可以发给GPRS模块AT命令的字符串来控制其行为。GPRS模块具有一套标准的AT命令集。1、一般AT命令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、网络服务相关命令AT+CNUM=?读取本机号码。AT+COPN读取网络运营商名称。AT+CSQ信号强度指示,返回接收信号强度指示值和信道误码率。3、呼叫控制命令ATDxxxxxxxx;拨打电话号码xxxxxxxx,注意最后要加分号,中间无空格。ATA接听电话。ATH拒接电话或挂断电话。AT+VTS=dtmfstr在语音通话中发送DTMF音,dtmfstr举例:“4,5,6”为456三字符。4、短消息命令AT+CMGC发出一条短消息命令。AT+CMGD=index删除短消息。index为所要删除短信的记录号。AT+CMGF=mode选择短消息格式。mode=0为PDU模式,1为文本模式。建议文本模式。AT+CMGL=stat列出当前短消息存储器中的短信。stat参数空白或0/RECUNREAD为未读,1/“RECREAD”为已读,2/“STOUNSENT”为待发,3/“STOSENT”为已发,4/“ALL”为全部的。AT+CMGR=index读取短消息。index为所要读取短信的记录号。AT+CMGS=xxxxxxxx‘CR’Text‘CTRL+Z’发送短消息。xxxxxxxx为对方手机号码,回车后接着输入短信内容,然后按CTRL+Z发送短信。CTRL+Z的ASCII码是26。AT+CNMI显示新收到的短消息。AT+CSCA?读取短消息中心地址。AT+CSMP设置短消息文本模式参数。3.3程序结构图程序结构如下图所示:3.4练习步骤3.4.1补充拨打电话模块的代码,并编译、运行。1)阅读main.c文件,分析主函数main()的代码流程;2)阅读线程处理函数keyshell()中的实现代码并分析其流程;3)进入gprs_init()函数的定义文件gprs.c中,补充gprs初始化代码,如下:voidgprs_init(){tty_writecmd(at,strlen(at));tty_writecmd(ate1,strlen(ate1));//设置音频通道:1,副音频通道tty_writecmd(at+chfa=1,strlen(at+chfa=1));//设置输出音频信号增益:100,最大音量tty_writecmd(at+clvl=100,strlen(at+clvl=100));//设置通道1的话筒增益:10,最大增益tty_writecmd(at+cmic=1,10,strlen(at+cmic=1,10));}4)分析函数tty_writecmd()的作用;5)在while循环过程中编写代码,实现gprs的命令菜单的输出;具体如下:printf(\ngprscontrolshell);printf(\n[1]giveacall);printf(\n[2]respondacall);printf(\n[3]holdacall);printf(\n[4]sendamsg);printf(\n[**]helpmenu);printf(\n[--]exit);6)分析函数get_line()的实现代码及作用;7)分析如何通过if判断实现菜单各项功能(拨打、接收、发短信)的?利用循环采集从键盘输入的信息,并执行相应的功能函数。以按键按下“1”为例:get_line(cmd);//采集按键数字if(strncmp(1,cmd,1)==0){//如果为“1”gprs_call(cmd,strlen(cmd));//调用“拨打电话”实现函数}8)编码实现拨打电话模块功能,在gprs.c文件中gprs_call函数处;voidgprs_call(char*number,intnum){tty_writecmd(at,strlen(at));//发送拨打命令ATDtty_write(atd,strlen(atd));//发送电话号码tty_write(number,num);//发送分号和命令结束标志tty_write(;\r,strlen(;\r));usleep(200000);}9)分析函数tty_write()的作用;10)执行make命令编译该程序,生成gprs可执行程序;11)利用mount命令挂载到开发板上,然后运行gprs程序;进行操作,看是否能够实现拨打电话的功能。3.4.2补充发送短信模块的代码,并编译、运行。1)在gprs.c文件中,在“//完善代码:实现发送短信gprs_msg()函数”注释行下面添加如下代码。实现短信息的发送功能。voidgprs_msg(char*number,intnum){charctl[]={26,0};//ctl[0]=26,ctrl+zchartext[]=gprssmsdemo!;tty_writecmd(at,strlen(at));//发送修改字符集命令:1,text格式tty_writecmd(at+cmgf=1,strlen(at+cmgf=1));//发送短信命令:命令+号码+信息+结束符tty_write(at+cmgs=,strlen(at+cmgs=));//发送电话号码tty_writecmd(number,strlen(number));//发送文本信息tty_write(text,strlen(text));//发送结束符tty_write(ctl,1);usleep(300000);}2)编译、执行,观察结果;3)请修改程序,将个人的“学号、姓名”以短信形式发送出去,看其他手机接收是否正常查看?3.4.3编码实现接听电话模块的功能。在gprs.c文件中,在“//完善代码:实现接听电话gprs_ans()函数”注释行下面添加如下代码。实现电话的接听功能。voidgprs_ans(){tty_writecmd(at,strlen(at));//发送接听命令ATAtty_writecmd(ata,strlen(ata));}3.4.4编码实现挂断电话模块的功能。在gprs.c文件中,在“//完善代码:实现挂断电话gprs_hold()函数”注释行下面添加如下代码。实现电话的挂断功能。voidgprs_hold(){tty_writecmd(at,strlen(at));//发送挂机命令ATHtty_writecmd(ath,strlen(ath));}编译项目,并运行调试;观察结果是否正确?3.4.5执行gprs程序,体验gprs程序的功能。1)拷贝本次练习编译后的程序gprs至/arm2410/emlab目录中。2)连接好实验开发板和开发宿主机(不要启动实验开发板)。3)连接好gprs模块、SIM卡、天线,然后小心并正确插入实验开发板的扩展槽中。4)启动minicom,给开发板加电,以nfs方法挂载gprs项目所在的目录。5)执行gprs程序,此时应能看到gprs初始化过程中的提示,然后显示一个命令菜单。6)在keyshell提示符下,利用小键盘输入“1”后回车,即开始拨打电话。然后会要求你输入所要拨打电话的号码,输入之后回车,观察结果是否能正常拨打电话?7)试一下发送短信的功能,看其他手机能否收到短信?