#include "SIM900.h"
#include "GUI.h"
#include "Format.h"
//------------------------—-缓冲区定义--------------------------
u8 uch_cmd[2]; //命令
GSMBUFf Gsm_buf; //通信缓冲区
SM_PARAM Sms_recv[READ_NUM]; //接收短信缓冲
SM_PARAM Sms_send; //发送短信缓冲
SM_PARAM Sms_last; //最后一条短信
TICKET_INFO st_tick; //订单缓存
SM_PARAM Sms_sp[SPSMS_UNUM][SPSMS_PNUM]; //存储拆分短信
//==================================================================================================
//| 函数名称 | Gsm_rcvinit
//|----------|--------------------------------------------------------------------------------------
//| 函数功能 | 接收缓冲区初始化
//|----------|--------------------------------------------------------------------------------------
//| 输入参数 |
//|----------|--------------------------------------------------------------------------------------
//| 返回参数 | 无
//|----------|--------------------------------------------------------------------------------------
//| 函数设计 | zb
//==================================================================================================
void Gsm_rcvinit(void)
{
u16 i;
Gsm_buf.recv_index = 0;
for(i=0;i<GSM_BUFLEN;i++)
{
Gsm_buf.recvbuf[i]=0;
}
}
//==================================================================================================
//| 函数名称 | Gsm_sendinit
//|----------|--------------------------------------------------------------------------------------
//| 函数功能 | 发送缓冲区初始化
//|----------|--------------------------------------------------------------------------------------
//| 输入参数 |
//|----------|--------------------------------------------------------------------------------------
//| 返回参数 | 无
//|----------|--------------------------------------------------------------------------------------
//| 函数设计 | zb
//==================================================================================================
void Gsm_sendinit(void)
{
u16 i;
Gsm_buf.send_index = 0;
for(i=0;i<GSM_BUFLEN;i++)
{
Gsm_buf.sendbuf[i]=0;
}
}
//==================================================================================================
//| 函数名称 | Gsm_SndAndwait
//|----------|--------------------------------------------------------------------------------------
//| 函数功能 | 发送命令,并等待返回
//|----------|--------------------------------------------------------------------------------------
//| 输入参数 | cmd:发送的命令 strwait:等回的字符串 trynum:尝试次数 timeout:超时倍数
//|----------|--------------------------------------------------------------------------------------
//| 返回参数 | 无
//|----------|--------------------------------------------------------------------------------------
//| 函数设计 | zb
//==================================================================================================
u8 Gsm_SndAndwait(u8 *cmd,u8 *strwait,u8 trynum,u8 timeout)
{
u8 i,err;
char *p;
OSSemPend(MutexGSM,0,&err);
for(i=0;i<trynum;i++)
{
//尝试发送
Gsm_rcvinit();
SIM900_SendStr(cmd);
OSTimeDly(TIME_OUT/10*timeout);
//首先处理从收的数据
Gsm_RecvCmd();
p = strstr((char*)Gsm_buf.recvbuf,(char*)strwait);
if(p)
{
(void)OSSemPost(MutexGSM);
return 1;
}
}
(void)OSSemPost(MutexGSM);
return 0;
}
//==================================================================================================
//| 函数名称 | Gsm_wait
//|----------|--------------------------------------------------------------------------------------
//| 函数功能 | 等待某命令
//|----------|--------------------------------------------------------------------------------------
//| 输入参数 | strwait:等回的字符串 trynum:尝试次数 timeout:超时倍数
//|----------|--------------------------------------------------------------------------------------
//| 返回参数 | 无
//|----------|--------------------------------------------------------------------------------------
//| 函数设计 | zb
//==================================================================================================
u8 Gsm_wait(u8 *strwait,u8 trynum,u8 timeout)
{
u8 i,err;
char *p;
OSSemPend(MutexGSM,0,&err);
for(i=0;i<trynum;i++)
{
OSTimeDly(TIME_OUT/10*timeout);
p = strstr((char*)Gsm_buf.recvbuf,(char*)strwait);
if(p)
{
(void)OSSemPost(MutexGSM);
return 1;
}
}
(void)OSSemPost(MutexGSM);
return 0;
}
//==================================================================================================
//| 函数名称 | Gsm_set
//|----------|--------------------------------------------------------------------------------------
//| 函数功能 | 设置命令
//|----------|--------------------------------------------------------------------------------------
//| 输入参数 |
//|----------|--------------------------------------------------------------------------------------
//| 返回参数 | 无
//|----------|--------------------------------------------------------------------------------------
//| 函数设计 | zb
//==================================================================================================
u8 Gsm_set(u8 *cmd)
{
u8 rst;
rst = Gsm_SndAndwait(cmd,"OK\r\n",RETRY_NUM,1);
return rst;
}
//==================================================================================================
//| 函数名称 | gsm_receive
//|----------|--------------------------------------------------------------------------------------
//| 函数功能 | 处理一个字节
//|----------|--------------------------------------------------------------------------------------
//| 输入参数 |
//|----------|--------------------------------------------------------------------------------------
//| 返回参数 | 无
//|----------|--------------------------------------------------------------------------------------
//| 函数设计 | zb
//==================================================================================================
void Gsm_receive(u8 dat)
{
if(Gsm_buf.recv_index >= GSM_BUFLEN)
{
Gsm_buf.recv_index = 0;
}
Gsm_buf.recvbuf[Gsm_buf.recv_index++] = dat;
}
//==================================================================================================
//| 函数名称 | Gsm_init
//|----------|--------------------------------------------------------------------------------------
//| 函数功能 | gsm初始化
//|----------|--------------------------------------------------------------------------------------
//| 输入参数 |
//|----------|--------------------------------------------------------------------------------------
//| 返回参数 | 无
//|----------|--------------------------------------------------------------------------------------
//| 函数设计 | zb
//==================================================================================================
u8 Gsm_init(void)
{
//PWR
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//复位
//SIM900_PWR_LOW;
//SIM900_PWR_HIGH;
//OSTimeDly(100);
//SIM900_PWR_LOW;
//初始化缓冲区
Gsm_rcvinit();
Gsm_sendinit();
//最近短信清零
Sms_last.id = 0;
//同步波特率
if(!Gsm_SndAndwait("AT\r\n","OK\r\n",1,1))
{
//重新开启模块
SIM900_PWR_LOW;
SIM900_PWR_HIGH;
OSTimeDly(100);
SIM900_PWR_LOW;
//等待两秒钟,RDY
Gsm_wait("RDY",1,4);
Gsm_set("AT\r\n");
}
//设置无回显
if(!Gsm_set("ATE0\r\n"))
{
return 0;
}
//设置波特率
if(!Gsm_set("AT+IPR=57600\r\n"))
{
return 0;
}
//设置短信格式为PDU
if(!Gsm_set("AT+CMGF=0\r\n"))
{
return 0;
}
//设置编码为unicode
if(!Gsm_set("AT+CSCS=\"UCS2\"\r\n"))
{
return 0;
}
//设置来电显示
if(!Gsm_
- 1
- 2
- 3
- 4
- 5
- 6
前往页