2440裸机编程之十一 GPRS

发布者:SereneSpirit最新更新时间:2019-11-09 来源: 51hei关键字:裸机编程  GPRS 手机看文章 扫描二维码
随时随地手机看文章

GPRS (General Packet Radio Service)是一种基于包的无线通讯服务。它将使得通讯速率从56一直上升到114Kbps,并且支持计算机和移动用户的持续连接。较高的数据吞吐能力使得可以使用手持设备和笔记本电脑进行电视会议和多媒体页面以及类似的应用。GPRS是基于Global System for Mobile(GSM),并且能完成现有的一些服务,例如:蜂窝电话电路交换(circuit-switched)连接和短消息服务(SMS)。


GPS/GPRS 的AT命令是对早期调制解调器AT命令的一个扩充,在早其AT命令的基础上加上对GSM/GPRS业务支持的扩展AT命令集,扩展AT命令集基本格式为“AT+”+命令字符及相关设置参数。


一、GPRS模块通过串口和PC机相连,用超级终端测试AT指令:

应答
AT
返回:OK

读取日期时间
AT+CCLK?
返回:+CCLK: "02/01/01,00:29:55"

拨打电话
ATDT电话号码;

读取设备名称
AT+GMI
返回:SIEMENS

读取软件名称
AT+GMM
返回:MC39i

读取信号强度
AT+CSQ
返回:+CSQ: 28,99

读取电话簿用户
AT+CPBR=1,2
返回:
+CPBR: 1,"137xxxx9236",129,"  "
+CPBR: 2,"138xxxx6183",129,"  "

单条读取短信
AT+CMGR=5
返回:
+CMGR: 1,,44
0891683108200205F0240D91683115829952F000080111615184202318989876EEFF1F62114E0D6E
05695A30026D176FA14E0DFF1F




下面用超级终端发送一条短信:
AT

OK

AT+CMGF=1                      (发送修改字符集命令,TEXT模式)

OK

AT+CSMP=17,167,0,0             (设置文本模式的参数)

OK

AT+CSCS=GSM

OK

AT+CMGS=159xxxx9928            (发送发短信命令)

>Hello!How are you?    (发送短信内容)

+CMGS: 86

OK


发送成功




二、利用2440的串口接GPRS模块实验


程序:
//***********************************************************************************
//***********************************************************************************
/*
*********************************************************
*         变量
*********************************************************
*/
char sms[50];
/*
*********************************************************
* 函数介绍:本函数被使用来做测试串口传输数据的功能。
* 输入参数:无
* 输出参数:无
* 返回值  :无
*********************************************************
*/

//***************************************************************************

#define RX_BUF_SIZE  1024
static char rx_buf[RX_BUF_SIZE];
static U16 rx_buf_head, rx_buf_tail;

#define RX_BUF_EMPTY() (rx_buf_head==rx_buf_tail)
#define RX_BUF_INC() (rx_buf_head = (rx_buf_head+1)&(RX_BUF_SIZE-1));
#define RX_BUF_DEC() (rx_buf_tail = (rx_buf_tail+1)&(RX_BUF_SIZE-1));


//串口1接收中断处理
static void __irq Uart1RxInt(void)
{
    ClearSubPending(BIT_SUB_RXD1); //rSUBSRCPND = BIT_SUB_RXD0;          //Clear pending bit (Requested)
    ClearPending(BIT_UART1);

//printf("URT1 rx interrupt!n");
rx_buf[rx_buf_head] = RdURXH1();
RX_BUF_INC();
if(RX_BUF_EMPTY())
  RX_BUF_DEC();
}

static void Echo_Rx_Data(void)
{
while(!RX_BUF_EMPTY()) {
  Uart_SendByte(rx_buf[rx_buf_tail]);
  RX_BUF_DEC();
}
}

/****************************************************************************
【功能说明】串口发送命令字符串并等待回显
****************************************************************************/
void GPRS_Cmd( char *pt )

Uart_Select( 1 ) ;  //选择UART通道为串口1
Uart_Printf( pt );
Uart_Select( 0 ) ;  //选择UART通道为串口0
Delay(10);
Echo_Rx_Data();
}

/****************************************************************************
【功能说明】初始化开发平台
****************************************************************************/
void GPRS_Init(void)
{    
U32 mpll_val = 0 ;

    Port_Init();  //端口初始化
    Isr_Init();   //中断初始化
mpll_val = (92<<12)|(1<<4)|(1);
//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(14, 12);
cal_cpu_bus_clk();
   
    Uart_Init(0,0,115200);  //串口初始化 波特率为115200
    Uart_Init(0,1,115200);
    Uart_Select(0);  //选者串口0
    rx_buf_head = rx_buf_tail = 0;

    pISR_UART1 = (U32)Uart1RxInt;  //串口接收数据中断
ClearSubPending(BIT_SUB_RXD1);
ClearPending(BIT_UART1);
EnableSubIrq(BIT_SUB_RXD1);
EnableIrq(BIT_UART1);

Clk0_Disable();
Clk1_Disable();


/****************************************************************************
【功能说明】发送挂机命令ATH
****************************************************************************/
void GPRS_HOLD()
{
GPRS_Cmd("ATr");
Delay(500);
GPRS_Cmd("ATHr");
}

/****************************************************************************
【功能说明】发送接听命令ATA
****************************************************************************/
void GPRS_ANSWER()
{
GPRS_Cmd("ATr");
Delay(500);
GPRS_Cmd("ATAr");
}

/****************************************************************************
【功能说明】发送拨打命令ATDT
****************************************************************************/
void GPRS_CALL(char *number)
{
GPRS_Cmd("ATr");
Delay(500);
GPRS_Cmd("ATDT");
GPRS_Cmd(number);
GPRS_Cmd(";r");
}

/****************************************************************************
【功能说明】发送短信
****************************************************************************/
static void GPRS_MGS(char *number, char *text)
{
GPRS_Cmd("ATr");
Delay(500);


GPRS_Cmd("AT+CMGF=1r");//发送修改字符集命令,TEXT模式
Delay(500);

GPRS_Cmd("AT+CSMP=17,167,0,0r");//设置文本模式的参数。
Delay(500);

GPRS_Cmd("AT+CSCS=GSMr");
Delay(500);

GPRS_Cmd("AT+CMGS=""); //发送发短信命令
GPRS_Cmd(number);
GPRS_Cmd(""r");
Delay(500);

GPRS_Cmd(text); 
Uart_Select( 1 ) ;  //选择UART通道为串口1
Uart_SendByte( 26 );  //"CTRL+Z"的ASCII码
Uart_Select( 0 ) ;  //选择UART通道为串口0
Delay(100);
Echo_Rx_Data();
Delay(5000);   //等待5秒  
Echo_Rx_Data();
}

/****************************************************************************
【功能说明】输入一组数字用作电话号码
****************************************************************************/
static int InputNumber(char *num)
{
int key;
int i=0;

for(i=0; i<20; i++)
  num[ i] = 0;
i = 0;

printf("Please input the number:n");
while(1)
{
  key = Uart_Getch();
  switch(key)
  {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
       num[i++] = key;
    Uart_Printf("%c",key);
    break;
   case ENTER_KEY:  //数字输入完毕
    //num[i++] = key;
    return i;
    break;
   default:  //数字输入错误!!!
    Uart_Printf( "输入错误,请重新输入!!!n");
    return 0;
    break ;  
     }
}
}

/****************************************************************************
【功能说明】GPRS模块Q2403实验程序
****************************************************************************/
void Main(void)
{
U16 key ;
char number[20];

GPRS_Init();

Test_Again:
Uart_Printf( "nGSM/GPRS TEST, press ESC key to exit !n" ) ;
Uart_Printf(" 1 : Send sh1111111ort messagen");
Uart_Printf(" 2 : Call the numbern");
Uart_Printf(" 3 : Ring offn");
Uart_Printf(" 4 : Pick upn");
  
while(1)
{
  key = Uart_Getch();
  if(key==ESC_KEY)
   break;
/*  if(key) {
   putch(key);
   WrUTXH1(key);
  }
*/  
  Echo_Rx_Data();
  
  switch( key )
  {
   case '1':
    Uart_Printf("Send short messagettn");
    Uart_Printf("Please enter the phone number:n");
    if( !InputNumber(number) )break;
    
    Uart_Printf("nPlease enter the context in English:n");
    Uart_GetString(sms);
    Uart_Printf("nNow send short message...n");
    GPRS_MGS(number,sms);
    //printf("n");
    //break;
    goto Test_Again;
        case '2':
         Uart_Printf("Call the numberttn");
         Uart_Printf("Please enter the phone number.n");
                if( !InputNumber(number) )  break;
                Uart_Printf("nNow send a call...n");
                GPRS_CALL(number);
                //printf("n");
                //break;
                goto Test_Again;
        case '3': Uart_Printf("Ring offttn");
                GPRS_HOLD();
                //break;
                goto Test_Again;
        case '4': Uart_Printf("Pick upttn");
                GPRS_ANSWER();
                //break;
                goto Test_Again;
  }
  }

}
//***********************************************************************************
//***********************************************************************************


实验结果:



关键字:裸机编程  GPRS 引用地址:2440裸机编程之十一 GPRS

上一篇:2440裸机编程之三 通用I/O口
下一篇:2440裸机编程之十 触摸屏

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved