⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms.cpp

📁 在pc机上应用tc35i进行调试的程序,有来电显,及拨号
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
        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 + -