2440裸机编程之十一 GPRS

2019-11-09来源: 51hei关键字:2440  裸机编程  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;
  }
  }

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


[1] [2]
关键字:2440  裸机编程  GPRS 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479513.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

S3C2440裸奔之环境搭建
首先需要搭建一个可以编译代码的环境。从一开始我就不想用ADS(安装完ADS后会产生一个CodeWarrior for ARM Developer Suite的工具,可以编译和调试代码),虽然它是个很好的工具,但是它却隐藏了很多的细节,不利于新手去深度学习。所以我还是希望从Makefile入手,一步一步弄懂所有的细节。第一步:需要先搭建一个Linux环境,我是安装在虚拟机上面的。安装好Linux后,再从网上下载arm-linux-gcc,一般解压后之后就可以直接使用了,但需要先设置好环境参数。二步:编写代码,然后在Linux系统上进行编译。代码在后面会给出。第三步:需要把编译好的bin文件烧写到板子上。这个需要使用J-Link烧录器,
发表于 2019-11-11
S3C2440裸奔之环境搭建
S3C2440裸奔之SDRAM
先安装ADS1.2,该软件主要用来编译并调试ARM处理器的程序的。下面所有的源程序都将通过ADS编译并最终链接成可执行文件,即.bin文件。下面的程序主要是先初始化SDRAM,然后将程序跳转到SDRAM中,并点亮4个LED灯。在ARM处理器启动的最开始,一般都需要:1、关闭“看门狗”;2、关闭中断;然后再初始化SDRAM,因为在初始化SDRAM时,要用到时钟频率,所以也需要设置时钟频率。以下是用汇编语言写的起动代码,为后面的C语言环境作铺垫。WTCON    EQU  0x53000000     ;Watch-dog timer modeINTMSK     E
发表于 2019-11-11
2440裸机编程之五 定时器
S3C2440A 具有5 个16 位定时器,每个定时器可以按照中断模式或DMA 模式工作。定时器0,1,2,3 具有PWM 功能。定时器4 是一个内部定时器,不具有对外输出口线。定时器0 还具有死区发生器,通常用于大电流设备。定时器特性总结如下。● 5 个16 位定时器可以工作在中断模式或DMA 模式。● 包括2 个8 位预分频器、2 个4 位分割器。● 输出波形的占空比可用编程控制(即进行脉宽调制)。● 具有自动重载模式或单次触发模式。● 具有死区发生器。与定时器相关的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn定时器的频率由PCLK分频而来,即Ftimer = PCLK
发表于 2019-11-11
2440裸机编程之五 定时器
2440裸机编程之六 实时时钟
实时日历时钟(RTC)单元作为S3C2440A 内部一个独立的功能单元,能够像钟表和日历一样保存并自动计算时间。它还具有定时报警和产生节拍的功能。RTC 单元仅需要通过外接一个32. 768 kHz 的晶振来提供时钟源。RTC 可以通过备用电池供电,因此,即使系统电源关闭,也可以继续工作。RTC 的寄存器保存了一些表示时间的8 位BCD 码数据,包括:秒、分、时、日期、星期、月和年。下面分四部分分别介绍:RTC的显示,RTC的设置,RTC的节拍中断,RTC的报警中断一、RTC的显示RTCCON用于RTC的控制,其中RTCCON[0]用于控制使能,所以在操作RTC的任何寄存器之前,要使这一位使能,这样才使操作有效rBCDYEAR&nb
发表于 2019-11-09
2440裸机编程之六 实时时钟
2440裸机编程之七 模数转换器ADC
S3C2440A 内部具有8 路模拟信号输入的10 位模/数转换器(ADC)。用到的寄存器有:ADCCON:用于选择通道、设置频率、开始转换、结束标志   ADC的频率 = PCLK/(ADCCON[13:6]+1)ADCDATn:用于读出ADC通道n的转换结果:ADCDATn[9:0]下面是个ADC通道0的实验程序://********************************************************************#define adc_frequency 2000000void Main(void){       &nb
发表于 2019-11-09
2440裸机编程之七 模数转换器ADC
2440裸机编程之八 UART通用异步收发
S3C2440A 内部集成的UART(通用异步收发器)单元提供三个独立的异步串行I/O端口,也就是通常所说的串口。串口是用途广泛的通讯口,很多工业现场总线都以串口为基础。在这里,串口不仅可以用来与外部设备进行数据通讯,还可以用来观察系统的运行状况,例如前面已经使用过的利用串口终端工具观察程序运行情况的方法。 S3C2440A 的UART 单元提供三个独立的异步串行I/O 端口,每个都可以在中断或DMA 两种模式下工作。它们支持的最高波特率为115. 2 kbps。每个UART 通道包含2 个64 位FIFO 分别供接收和发送使用。S3C2440A 的UART 具有以下可配置的参数项目:可编程的波特率,红外收/发模式,l
发表于 2019-11-09
2440裸机编程之八 UART通用异步收发
小广播
何立民专栏 单片机及嵌入式宝典

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

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