📄 sms.cpp
字号:
{
return(FALSE);
}
return TRUE;
}
//---------------------------------------------------------------------------------
// 开启GPRS模式函数
// 该函数在GSM模式下开启GPRS功能模式
//---------------------------------------------------------------------------------
BOOL Open_GPGS_Mode()
{
char cmd[30]; // 命令串
char ans[128]; // 应答串
if(GSM_MODE==GSM_SMS_MODE) // 在短信模式下,说明注册网络成功
{
sprintf(cmd,"AT^SISO=1\r");
GSM_MODE = GSM_GPRS_MODE;
WriteComm(cmd, 20);
for(int i=0; i<1000; i++)
for(int j=0; j<1000; j++)
;
//Sleep(10000);
for(i=0; i<10000; i++)
{
ReadComm(ans, 128);
if (strstr(ans, "OK") != NULL)
return TRUE;
}
if (strstr(ans, "OK") == NULL)
return FALSE;
GSM_MODE = GSM_GPRS_MODE;
}
return(TRUE);
}
//----------------------------------------------------------------------------------
// 关闭GPRS功能函数
// 改函数关闭GPES功能,返回到短信模式下
//----------------------------------------------------------------------------------
BOOL Close_GPGS_Mode()
{
char cmd[30]; // 命令串
char ans[128]; // 应答串
if(GSM_MODE==GSM_GPRS_MODE)
{
sprintf(cmd,"AT^SISC=1\r");
GSM_MODE = GSM_GPRS_MODE;
WriteComm(cmd, 10);
ReadComm(ans, 128);
if (strstr(ans, "OK") == NULL)
return FALSE;
GSM_MODE = GSM_SMS_MODE;
}
return(TRUE);
}
//----------------------------------------------------------------------------------
// GPRS模式下读取数据命令
// 待修改
//----------------------------------------------------------------------------------
BOOL Read_GPRS_Data()
{
char cmd[30]; // 命令串
char ans[128]; // 应答串
sprintf(cmd,"AT^SISR=1,500\r");
if(AT_Command(cmd,2,15,1000)==TRUE) // 发送读取命令
{
Sleep(5000); // 等待接收到数据时间5s待调整
ReadComm(ans, 128);
if(GSM_RecString_Comp(ans, 128)==2)
{
return(TRUE);
}
}
WriteComm(cmd, 14); // 发送读取命令
Sleep(500); // 等待接收到数据时间5s待调整
ReadComm(ans, 128);
if (strstr(ans, "OK") == NULL)
return FALSE;
return TRUE;
}
//-----------------------------------------------------------------------------------
// GPRS模式下写数据命令
// 写数据到控制中心 参数a为数据地址,length为数据长度,并且长度必须大于2
// 如果数据长度为1,2,返回信息无法区分是URC还是回复玛
//-----------------------------------------------------------------------------------
BOOL Write_GPRS_Data(char a[],int length)
{
char cmd[30] = "AT^SISW=1,";
char ans[128]; // 应答串
char cnt,i=10;
if((GSM_STATUS1!=GSM_RECIVE_URC)&&(length>2))
{
if(length>=10)
{
cnt = length/100;
if(cnt>0)
{
cmd[i++] = cnt + 0x30; // 信息转换,将数据长度转换成字符串
length -= cnt*100;
}
cnt = length/10;
cmd[i++] = cnt + 0x30;
}
cnt = length%10;
cmd[i++] = cnt + 0x30;
cmd[i++] = '\r';
cmd[i] = 0;
if(AT_Command(cmd,3,14,1000)==TRUE) // 发送写命令
{
sprintf(a,"hello\r");
WriteComm(a,10); // 写数据
CRLF_Cnt = 0;
GSM_STATUS0 = GSM_WAIT_REP;
Sleep(1000);
for(int j=0; j<10000; j++)
{
ReadComm(ans, 128);
}
if(GSM_RecString_Comp(ans, 128)==2) // 等待应答
{
return(TRUE);
}
}
/*
WriteComm(cmd, 14);
for(int i=0; i<10000; i++)
for(int j=0; j<10000; j++)
;
ReadComm(ans, 128);
if(GSM_RecString_Comp(ans,128)==2) // 等待应答
{
return(TRUE);
}
*/
//if (strstr(ans, "OK") == NULL)
//return FALSE;
}
return(FALSE);
}
//----------------------------------------------------------------------------------
// 接收到GSM回复信息区分判断函数
// 该函数判串口接收的GSM回复信息,并将他们用不同的代码标记,以便以后的程序利用
// 如果在回复信息中有两个不同的信息,那么他们的代码标记相加为最后的代码标记
// 该函数代码标记方便AT_Command()函数的回复比较操作。
// 同时在GSM_REP_Buffer缓冲区中很可能混有URC代码,故在本程序中同时进行了URC判断,防止
// URC信息丢失,检测到URC信息后将相应标志位置位,最后将信息缓冲区清0
//----------------------------------------------------------------------------------
char GSM_RecString_Comp(char ans[], int length)
{
char code = 0; // GSM回复信息代码标记变量
char *p;
// int i;
char cmd[] = "AT+CNMA=0\r"; // 接收到短信后,
//确认恢复命令
if(strstr(ans, "ERROR") != NULL) // 接收到的回复信息为ERROE
{
code = 1; // 分配ERROR代码为1
}
else if(strstr(ans, "OK") != NULL) // 接收到的回复信息是OK
{
code = 2; // 分配OK代码为2
}
if(strstr(ans, "+CPMS") != NULL) // 接收到恢复信息是CPMS
{ // 分配CPMS代码为3,
code += 3; // 由于CPMS回复后面正常跟随OK,所以最终的回复代码是2+3=5
}
if(strstr(ans, "+CSMS") != NULL) // 接受到的回复信息为CSMS
{ // 分配CSMS代码为4
code += 4; // 由于CSMS回复后面正常跟随OK,所以最终的回复代码是2+4=6
}
if(strstr(ans, ">") != NULL) // 接受到的回复信息是'>'该信息为发送短信允许标志
{
code += 7; // 分配给'>'回复为7
}
if(strstr(ans, "+CMGS") != NULL) // 接收到的回复信息为CMGS
{ // 分配CMGS代码8
code += 8; // CMGS为短信发送成功回复,通常后面跟随OK所以最终代码2+8=10
}
if(strstr(ans, "+CMGR") != NULL) // 接收到CMGR回复
{ // 分配给CMGR代码11
code += 11; // CMGR为读短信成功命令,后面通常跟随OK,所以最终代码2+11=13
}
if(strstr(ans, "^SISW: 1, 1\r") != NULL)// 判断是否接收到了^SISW允许写URC
{
GSM_URC_SIGN |= GSM_URC_WRITE; // 接收到了将允许写标志置位
}
else if(strstr(ans, "^SISW: 1") != NULL)// 接收到了回复信息为SISW,该信息为SISW命令的回复
{
code +=14; // 分配SISW代码为14
}
if(strstr(ans, "^SISR: 1, 1\r") != NULL)// 接收到^SISR请求读URC
{
GSM_URC_SIGN |= GSM_URC_READ; // 将请求读标志置位
}
else if((p=strstr(ans, "^SISR: 1")) != NULL)// 接收到回复信息为SISR,该信息为SISR读命令的回复
{
GSM_STATUS1 = GSM_RECIVE_DATA;
p += 10;
GSM_DATA_SUM = *p-0x30;
p++;
if((*p>='0')&&(*p<='9'))
{
GSM_DATA_SUM *= 10;
GSM_DATA_SUM += *p-0x30; // 从改信息中取出能读到的数据个数
}
p++;
if((*p>='0')&&(*p<='9')) // 暂盯最大可读3位数据,
{
GSM_DATA_SUM *= 10;
GSM_DATA_SUM += *p-0x30;
}
code +=15; // 分配SISR代码为15
}
if((p=strstr(ans, "^SIS:")) != NULL) // 接收到^SIS客户端SOCKET异常URC
{
GSM_URC_SIGN |= GSM_URC_SIS; // SOCKET异常标志置位
p += 6;
GSM_SOCKET_ERROR = *p - 0x30;
p++;
if((*p>='0')&&(*p<='9'))
{
GSM_SOCKET_ERROR *= 10; // 取异常代码放入GSM_SOCKET_ERROR,待处理
GSM_SOCKET_ERROR += *p -0x30;
}
}
if((p=strstr(ans, "+CREG:")) != NULL) // 接收到CREG网络变化状态报告URC
{
GSM_URC_SIGN |= GSM_URC_CREG; // 将网络状态变化标志置位
p += 7;
GSM_REGIST_STATUS = *p; // 取当前状态码保存
}
if((p=strstr(ans, "+CMTI:")) != NULL) // 接收到CMTI接收到短信报告URC
{
WriteComm(cmd, 10); // 回复网络接收到短信命令
GSM_URC_SIGN |= GSM_URC_CMTI; // 接收到短信标致置位
p += 12;
GSM_SMS_NUMBER = *p - 0x30;
p++;
if((*p>='0')&&(*p<='9'))
{
GSM_SMS_NUMBER *= 10; // 读取短信序号
GSM_SMS_NUMBER += *p - 0x30;
}
}
if(code!=13) // 如果回复代码是13,是读取SIM卡短信命令
{ // GSM_REP_Buffer信息暂时保留,带后面的程序读取SIM信息
/*
for(i=0;i<GSM_REP_Cnt;i++)
{
GSM_REP_Buffer[i] = 0; // 否则将处理完的信息清0
}
GSM_STATUS0 = GSM_NORMAL; // 系统状态清0
GSM_REP_Cnt = 0; // 接收记数变量清0
*/
}
return(code);
}
//------------------------------------------------------------------------------------
// AT命令发送函数
// 该函数向GSM模块发送AT命令,并等待恢复结果,如果恢复结果不正确,重发,连续三次错误,返回发送失败
// 入口参数:cmd要发送的命令指针,str与接收到的结果字符串进行比较的字符串,length为字符串的比较长度
// 出口:发送成功返回TRUE,发送失败返回FALSE
//------------------------------------------------------------------------------------
BOOL AT_Command(char *cmd, char length, char code, int time)
{
char i;
char ans[128]; //返回串
for(i=0; i<3; i++) // 连发三次循环
{
//Sleep(100);
if(GSM_STATUS1!=GSM_RECIVE_URC)
{
//WriteComm(cmd, length);// 发送命令
WriteComm(cmd, 60);
CRLF_Cnt = 0; // <CR><LF>记数变量清0
CRLF_Expect = length; // 等待期望的<CR><LF>个数
GSM_STATUS0 = GSM_WAIT_REP; // GSM_STATUS状态变量设置为等待回复,并设置工作模式
//Sleep(time); // 等待接收回复
ReadComm(ans, 128);
if(GSM_RecString_Comp(ans, 128)==code)
{
return(TRUE);
}
}
}
return(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -