📄 gprs.c
字号:
/****************************************************************************/
//头文件定义
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "gprs.h"
//***************************************************************************
char AT_BUF[ 1024 ] ;
//***************************************************************************
#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))
//extern char *number[]={"1","3","5","1","3","3","4","9","7","7","6"};
extern char number[]={'1','3','0','8','1','8','8','1','6','8','4'};
//extern char number[]={'1','3','5','8','2','4','0','3','9','6','1'};
/********************************************************************
Function name: isr_uart1_rx
Parameter : void
Description : 串口1接收中断处理程序
Return : void
Argument : void
Autor & date :
*********************************************************************/
static void __irq isr_uart1_rx(void)
{
rI_ISPC = BIT_URXD1; /* 清除中断标志 */
//printf("URT1 rx interrupt!\n");
rx_buf[rx_buf_head] = RdURXH1();
RX_BUF_INC();
if(RX_BUF_EMPTY())
RX_BUF_DEC();
}
/********************************************************************
Function name: Echo_Rx_Data
Parameter : void
Description : 串口回显函数
Return : void
Argument : void
Autor & date :
*********************************************************************/
static void Echo_Rx_Data(void)
{
while(!RX_BUF_EMPTY())
{
Uart_SendByte(rx_buf[rx_buf_tail]);
RX_BUF_DEC();
}
}
/********************************************************************
Function name: GPRS_Cmd
Parameter : void
Description : 串口发送命令字符串并等待回显
Return : void
Argument : void
Autor & date :
*********************************************************************/
void GPRS_Cmd( char *pt )
{
int i=0;
while( pt[i] )
{
Uart_Select( 1 ) ; //选择UART通道为串口1
Uart_SendByte( pt[i] );
Uart_Select( 0 ) ; //选择UART通道为串口0
i++;
}
Delay(100);
Echo_Rx_Data();
}
/********************************************************************
Function name: Test_GPRS_Init
Parameter : void
Description : GPRS初始化
Return : void
Argument : void
Autor & date :
孙智涛:不同GPRS模块的初始化应该不会有什么区别
*********************************************************************/
static void Test_GPRS_Init(void)
{
Uart_Printf("Initialize GPRS modem...\n");
rx_buf_head = rx_buf_tail = 0;
pISR_URXD1 = (unsigned)isr_uart1_rx;
rINTCON = 0x5; /*Non-vect,IRQ enable,FIQ disable */
rINTMOD = 0x0; /*设置所有中断为IRQ模式*/
rINTMSK &= ~(BIT_GLOBAL|BIT_URXD1); /*使能串口1接收中断,屏蔽其他中断*/
Uart_Printf("Initialize GPRS modem...\n");
Uart_Init( 0,115200 ) ;
GPRS_Cmd("AT\r");//测试连接是否正确
Delay(5000);
GPRS_Cmd("ATE1\r");//打开回显。使用超级终端测试命令时打开
Delay(5000);
GPRS_Cmd("AT+CMGF=1\r");//设置短消息格式为text
Delay(5000);
GPRS_Cmd("AT+CNMI=2,1,0,0,0\r");//设置新短消息通知电脑端
Delay(5000);
}
/********************************************************************
Function name: Test_GPRS_Exit
Parameter : void
Description : GPRS退出
Return : void
Argument : void
Autor & date :
*********************************************************************/
static void Test_GPRS_Exit(void)
{
rINTMSK |= BIT_URXD1; /*禁止串口1接收中断*/
}
/********************************************************************
Function name: GPRS_MGS
Parameter : *num:电话号码的指针变量
*text:要发送的文本信息
Description : 输入一组数字用作电话号码
Return : void
Argument : void
Autor & date :
*********************************************************************/
static void GPRS_MGS(char *number, char *text)
{
GPRS_Cmd("AT\r");
Delay(5000);
//GPRS_Cmd("AT+CSCA="); //短消息中心号码。孙:例程无
//GPRS_Cmd("+8613010180500\r"); //孙:例程无
//Delay(5000); //孙:例程无
GPRS_Cmd("AT+CMGF=1\r");//发送修改字符集命令,TEXT模式
Delay(5000);
GPRS_Cmd("AT+CMGS="); //发送发短信命令
GPRS_Cmd(number);
GPRS_Cmd("\n");
Delay(5000); //孙:例程无
GPRS_Cmd(text);
Uart_Select( 1 ) ; //选择UART通道为串口1
Uart_SendByte( 26 ); //"CTRL+Z"的ASCII码
Uart_Select( 0 ) ; //选择UART通道为串口0
Delay(10000);
Echo_Rx_Data();
}
/********************************************************************
Function name: Send_AT_Command
Parameter : *comm:字符串指针
Description : 发送AT指令集
Return : 成功返回0
Argument : void
Autor & date :
*********************************************************************/
/*U16 Send_AT_Command( char *comm )
{
U16 m ;
U32 timeout = 50000 ;
char data ;
for( m = 0; m < 1024; m++ ) AT_BUF[m] = 0 ;
Uart_Select( 1 ) ;
while( *comm )
{
while( !(rUTRSTAT1 & 0x2) ) ; //Wait until THR is empty.
WrUTXH1( *comm++ ) ;
if((rUTRSTAT1 & 0x1)) //Receive data ready
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0( RdURXH1() );
}
}
while( !(rUTRSTAT1 & 0x2) ) ; //回车确认字符
WrUTXH1( 0x0d ) ;
if((rUTRSTAT1 & 0x1)) //Receive data ready
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0( RdURXH1() );
}
while( !(rUTRSTAT1 & 0x2) ) ; //回车确认字符
WrUTXH1( 0x0a ) ;
if((rUTRSTAT1 & 0x1)) //Receive data ready
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0( RdURXH1() );
}
m = 0 ;
while( timeout-- )
{
if((rUTRSTAT1 & 0x1)) //Receive data ready
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
data = RdURXH1() ;
WrUTXH0( data );
AT_BUF[m++] = data ;
}
}
return 0 ;
}*/
/********************************************************************
Function name: Test_Q2403A
Parameter : void
Description : GSM/GPRS短信发送,打电话
Return : void
Argument : void
Autor & date :
*********************************************************************/
void Test_Q2403A(void)
{
//char number[20];
char Message[64] = {"Your car has been stolen! "} ;
Test_GPRS_Init(); //GPRS/GSM模块初始化
Uart_Printf(" Send short message\n");
while(1)
{
Uart_Printf("\nNow send short message...\n");
GPRS_MGS( number, Message );
Delay(300000) ;
}
Test_GPRS_Exit(); //GPRS退出程序
}
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -