📄 gprs.c
字号:
}
}
/*********************************************************************************************************
** 函数名称: ModemInit
** 功能描述: 初始化Modem
** 输 入: 波特率
**
** 输 出: modem状态
**
** 全局变量: ModemState
** 调用模块: UART1Init,OSTimeDly,ModemCommand,
**
** 作 者: Yehaoben
** 日 期: 2005年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 ModemInit(uint32 bps)
{
ModemState = MODEM_CLOSE;
UART1Init(bps);
ModemSem = OSSemCreate(1);
HaveCall = OSSemCreate(0);
if (ModemSem != NULL)
{
if ((U1MSR & 0x30) != 0x30)
{
OSTimeDly(OS_TICKS_PER_SEC);
if ((U1MSR & 0x30) != 0x30)
{
ModemState = NOT_FIND_MODEM;
}
}
if (ModemState == MODEM_CLOSE)
{
ModemCommand("AT$NOSLEEP=1");
ModemCommand("AT+CREG=1");
}
//OSTaskCreate(GPRSCheckTask, (void *)0, &GPRSTaskStartStk[GPRS_TASK_STK_SIZE - 1], 7);
}
else
{
ModemState = NOT_INIT_MODEM;
}
return ModemState;
}
/*********************************************************************************************************
** 函数名称: GPRSSendMSG
** 功能描述: 发短信
** 输 入: 短信地址,短信信息
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_MSG_STR[]={"AT+CMGS=\"%s\"\r\n"};
uint8 GPRSSendMSG(char * num, char * MSG)
{
uint8 i,j,err;
char sendchar[30];
char temp[2];
ModemCommand("AT+CMGF=1");
OSSemPend(ModemSem, 0, &err);
GetAllChar();
_sprintf(sendchar,GPRS_MSG_STR,num);
ModemWrite(sendchar,strlen(sendchar));
i = ModemGetch();
j = 0;
while ( j <= 30 )
{
if (i == '>')
{
break;
}
i = ModemGetch();
j++;
}
if(j >=30 )
{
OSSemPost(ModemSem);
return 1;
}
ModemWrite(MSG,strlen(MSG));
temp[1]=0;
temp[0]=0x1a;
ModemWrite(temp,1);
i = ModemGetch();
j = 0;
OSTimeDly(OS_TICKS_PER_SEC*3);
GetAllChar();
GetAllChar();
OSSemPost(ModemSem);
return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSAutoTakeTheCall
** 功能描述: 接电话
** 输 入: 无
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSAutoTakeTheCall()
{
uint8 err;
OSSemPend(HaveCall, OS_TICKS_PER_SEC*2, &err);
if(err == OS_NO_ERR)
{
ModemCommand("ATA");
return 0;
}
else
return 1;
}
/*********************************************************************************************************
** 函数名称: GPRSSetMSGCenter
** 功能描述: 设置短信中心
** 输 入: number 短信中心码
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_SETMSGCRT_STR[]={"AT+CSCA=\"%s\"\r\n"};
uint8 GPRSSetMSGCenter(char * number)
{
char sendchar[30];
GetAllChar();
_sprintf(sendchar,GPRS_SETMSGCRT_STR,number);
ModemCommand(sendchar);
return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSTakeTheCall
** 功能描述: 接电话
** 输 入: 无
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSTakeTheCall()
{
ModemCommand("ATA");
return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSHangUpTheCall
** 功能描述: 挂电话
** 输 入: 无
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 GPRSHangUpTheCall()
{
ModemCommand("AT+CHUP");
return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSDelMSG
** 功能描述: 删除短信
** 输 入: num 短信的存储号(1~20)
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_DELMSG_STR[]={"AT+CMGD=%d\r\n"};
uint8 GPRSDelMSG(uint8 num)
{
char sendchar[15];
GetAllChar();
_sprintf(sendchar,GPRS_DELMSG_STR,num);
ModemCommand(sendchar);
return 0;
}
/*********************************************************************************************************
** 函数名称: GPRSReadMSG
** 功能描述: 读短信
** 输 入: 短信号码,对发号码,短信内容
**
** 输 出: 成功 0 失败1
**
** 全局变量:
** 调用模块:
**
** 作 者: Yehaoben
** 日 期: 2005年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
const char GPRS_RCVMSG_STR[]={"AT+CMGR=%d\r\n"};
uint8 GPRSReadMSG(uint8 num,char * number,char * MSG )
{
char sendchar[15];
char i,j;
uint8 err;
GetAllChar();
ModemCommand("AT+CMGF=1");
OSSemPend(ModemSem, 0, &err);
_sprintf(sendchar,GPRS_RCVMSG_STR,num);
ModemWrite(sendchar,strlen(sendchar));
i = ModemGetch();
j = 0;
while ( j <= 5 )
{
if (i == 0x2c)
{
break;
}
i = ModemGetch();
if(i == 0)
j++;
}
if( j >=5 )
{
OSSemPost(ModemSem);
return 1;
}
i = ModemGetch();//for "
i=0;
do//save number
{
number[i] = ModemGetch();
i++;
}while(number[i-1] != 0x22);
number[i-1] = 0;
err = 0;
i = ModemGetch();
while ( err <= 5 )//find the MSG
{
j = i;
i = ModemGetch();
if (j == 0x0d)
if (i == 0x0a)
{
break;
}
if(i == 0)
err++;
}
j = 0;
err = 0;
MSG[0] = ModemGetch();
MSG[0] = ModemGetch();
while ( err <= 5 )//Save the MSG
{
MSG[j+1] = ModemGetch();
//if ( (i == 'O') || (i == 'o') )
//if ( (MSG[j] == 'K') || (MSG[j] == 'k') )
if ( (MSG[j] == 0x4f) || (MSG[j] == 0x6f) )
if ( (MSG[j+1] == 0x4b) || (MSG[j+1] == 0x6b) )
{
i = ModemGetch();
i = ModemGetch();
break;
}
if(MSG[j+1] == 0)
err++;
else
j++;
}
if( j > 0 )
{
for(i = 0; i < j ; i++ )
{
if(MSG[i] == 0x0d )
if(MSG[i+1] == 0x0a )
if((MSG[i+2] == 0x4f) || (MSG[i+2] == 0x6f) )
if((MSG[i+3] == 0x4b) || (MSG[i+3] == 0x6b) )
{
MSG[i] = 0;
break;
}
}
OSSemPost(ModemSem);
return 0;
}
OSSemPost(ModemSem);
return 1;
}
/*********************************************************************************************************
** 函数名称: UART1_Exception
** 功能描述: UART1中断服务程序
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: ModemState
** 调用模块: OSSemPost
**
** 作 者: 陈明计
** 日 期: 2004年2月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void UART1_Exception(void)
{
uint8 IIR, temp;
OS_ENTER_CRITICAL();
while(((IIR = U1IIR) & 0x01) == 0)
{ /* 有中断未处理完 */
switch (IIR & 0x0e)
{
case 0x00: /* Modem状态变化 中断 */
break;
case 0x02: /* THRE中断 */
//OSSemPost(Uart1Send);
break;
case 0x04: /* 接收数据可用 */
OSSemPost(Uart1Get);
U1IER &= (~0x01); /* 禁止接收及字符超时中断 */
break;
case 0x06: /* 接收线状态 */
temp = U1LSR;
break;
case 0x0c: /* 字符超时指示 */
OSSemPost(Uart1Get);
U1IER &= (~0x01); /* 禁止接收及字符超时中断 */
break;
default :
break;
}
}
VICVectAddr = 0; // 通知中断控制器中断结束
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -