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

📄 main.c

📁 用来pdu编解码
💻 C
📖 第 1 页 / 共 3 页
字号:
		dprintf1("AT\r\n");
		num=0 ;
		flag = 0 ;
		while(num <10)
		{
			sprintf( str , "second=%d" , num+1 );
			RunMsgPrintf(str);
	
			num++;
			delay_s(1);
			if (ReadDownBuf( str , 9 ) ==0)continue ;	  
			if( (strstr(str,"OK")!=0) || (strstr(str,"ok")!=0) )
			{
				flag = 1 ;
				break ;
			}
		}
		
		if (flag==0)//等待AT响应超时,模块没有相应
		{
			RunMsgPrintf("等待AT响应超时");
			return 0 ; 
		}
		
		RunMsgPrintf("gsm模块响应");
		delay_s(1) ;
		
		RunMsgPrintf("正在对gsm初始化...");
		
		delay_s(20) ;
		//关闭回显
		dprintf1("ATE0\r\n");
    	delay_ms(500);
		//短消息直接输出,不经过SIM卡
//    	dprintf1("AT+CNMI=1,1,0,0,0\r\n");
    	dprintf1("AT+CNMI=2,2,0,0,0\r\n");
    	delay_ms(500);

		num = 0 ;

		RunMsgPrintf("正在读取短信中心号码...");

		while(num < 100)
		{
			num++;  
			ClearDownBuff() ; 
			dprintf1("AT+CSCA?\r\n");	
			delay_s(1);
			for(kk=0; kk< DownBufMax; kk++)
			{
				len = ReadDownBuf( str , 59 );
				if(len > 0)
				{
					if((strstr(str,"+CSCA:")!=0))
					{
						len = FindeCharInStr (str , len , 1 , '"');
						myCopy( str , SysPara.ServerCenter , len+2 , 13 );
		
						RunMsgPrintf("获得中心号码:");	
						RunMsgPrintf(SysPara.ServerCenter);	
						
						return 1;
					}										
				} 
			}
		}
		return 0 ;
					
}
/*-----------------------------------------------------------------------
功能:清空下行数据缓冲区
-------------------------------------------------------------------------*/
void ClearDownBuff (void)
{
		int j ;
		
		DownBuf.BufBegin = 0 ;//清空接收缓冲区,使缓冲区处于可写不可读的状态		
		DownBuf.BufEnd = 0 ;
		for ( j = 0 ; j < DownBufMax ; j++ )
		{
			DownBuf.Buff[j].len = 0 ;
			DownBuf.Buff[j].state = writeonly ;
		
		}
}
/*-----------------------------------------------------------------------
功能:清空上行数据缓冲区
-------------------------------------------------------------------------*/
void ClearUpBuff (void)
{
		int j ;
		
		UpBuf.BufBegin = 0 ;//清空接收缓冲区,使缓冲区处于可写不可读的状态		
		UpBuf.BufEnd = 0 ;
		for ( j = 0 ; j < UpBufMax ; j++ )
		{
			UpBuf.Buff[j].len = 0 ;
			UpBuf.Buff[j].state = writeonly ;		
		}
}
/*-----------------------------------------------------------------------
判断数据缓冲区中数据的类型
输入:p 来自GSM的信息,这里只处理跟短信有关的几条信息
		1 +CMTI=class2短消息的指示信息
		2 +CMGR=class2短消息的内容信息 
		3 +CMT=除class2短消息之外的其他类短消息的内容信息
[note]通常用手机发送的短消息,都是无类型的。
-------------------------------------------------------------------------*/

void CheckDownData(TBuff *p) 
{ 
	int  i ;
	SM_PARAM MySM_PARAM;

	//短消息直接输出
	if (strstr((*p).data , "\r\n+CMT:")!=NULL)
	{
		DecodeSms((*p).data, (*p).len, &MySM_PARAM );
		centFrameDeal(MySM_PARAM.TP_UD, MySM_PARAM.TP_UDlen);	
		
		return ;
	}
	//TA返回短信
	if (strstr((*p).data , "\r\n+CMGR:")!=NULL)
	{
		DecodeSms((*p).data, (*p).len, &MySM_PARAM );
		centFrameDeal(MySM_PARAM.TP_UD, MySM_PARAM.TP_UDlen);	
		return ;
	}
	if (strstr((*p).data , "+CMTI:")!=NULL) //用于处理class2的短消息提示
	{
		if (sscanf((*p).data,"\r\n+CMTI: \"SM\",%d\r\n", &i) ==1)
		{			
			dprintf1("AT+CMGR=%d\r\n" , i);
			delay_s(3);	
			//等待终端接收完毕后删除短信
			dprintf1("AT+CMGD=%d\r\n" , i);	
		}

		return ;
	}

}
//**************************************************************************
//函数:SendSms
//功能: 发送一条短信
//输入:MySM_PARAM=短信信息
//返回:0=发送失败,1=发送成功
//**************************************************************************
char SendSms(SM_PARAM *MySM_PARAM)
{
	unsigned char pDst[350];
	char cmd[20];

	sprintf(MySM_PARAM->SCA , SysPara.ServerCenter);
	sprintf(MySM_PARAM->TPA , BasicPara.CenterGsmNum);
	MySM_PARAM->TP_DCS = GSM_8BIT;
	
	delay_s(3);
	sprintf(cmd, "at+cmgs=%d\r\n" , gsmEncodePdu( MySM_PARAM , pDst ));
	myprintf1(cmd);
	myprintf0(cmd);
	delay_s(1);
	myprintf0(pDst);
	myprintf1(pDst);
	
	delay_s(1);
	
	
	return 1;		
}
//**************************************************************************
//函数:解码短信
//功能: 解码一条短信
//输入:MySM_PARAM=短信信息
//返回:0=解码失败,1=解码成功
//**************************************************************************
char DecodeSms(unsigned char *sms , int smsLen, SM_PARAM *MySM_PARAM )
{
	int i;
	
	i = FindeCharInStr( sms , smsLen , 2 , 0x0a ) ;//定位换行符
 	if (i>-1)
 	{
 		gsmDecodePdu( sms + 1 +i , MySM_PARAM ) ;   //解码pdu
 			
 	}
 	
 	return 1;
}
//**************************************************************************
//函数:DebugInfo
//功能: 显示运行信息
//**************************************************************************
void ConsolePrintf(unsigned char *info)
{		
	dprintf0("\r\n#ZF> %s", info);		
}
void delay_s(int i)
{
	int ss ;
	
	if (i<=0)return ;
	for(ss=0;ss<i;ss++)
		delay_ms(8000);
}

void delay_ms(int i)
{
	int kk ,hh ;
	
	if (i<=0)return ;
	for(kk=0;kk<i;kk++)
		for(hh=0;hh<8000;hh++);
}
//**************************************************************************
//函数:ExplainCommand
//功能: 解释并响应console口的命令
//输入:cmd=console口输入命令,cmdLen=命令长度
//返回:0=不可识别命令,1=可识别命令
//**************************************************************************
char ExplainConsoleCmd (char *cmd, int cmdLen) 
{
	char flag = 0;
	int kk, jj;
//	SM_PARAM MySM_PARAM;
	
	
	myprintf0("\r\n#ZF> ");

	//换行
	if (cmd[0]=='\r')return 0;	
		
	//以下全部当作命令处理
	if ((cmdLen < 3)||(cmdLen > 100))
	{
		flag = 0;	
	}else if ((*cmd != 'T')||(*(cmd+1) != 'M'))
	{
		flag = 0;				
	}
	else if (strcmp(cmd , "TM?\r")==0)//测试终端是否正常工作
	{
		myprintf0("\r\nTM\r\nOK\r\n");
		flag = 1;
	}
	else if (strcmp(cmd , "TM+BPID=?\r")==0)//读取ID
	{
		
		dprintf0("\r\n+BPID: %s%s%s\r\nOK\r\n", 
						BasicPara.TM_Time,
						BasicPara.TM_type,
						BasicPara.TM_id
						);
		flag = 1;	
	}	
	else if (strstr(cmd , "TM+BPID=")!=0)//设置ID
	{
		if ( cmdLen == 25)
		{
			
			myCopy(cmd, BasicPara.TM_Time, 8, 6);
			myCopy(cmd, BasicPara.TM_type, 8+6, 4);
			myCopy(cmd, BasicPara.TM_id, 8+6+4, 6);
			
			dprintf0("\r\n+BPID: %s%s%s\r\nOK\r\n", 
							BasicPara.TM_Time,
							BasicPara.TM_type,
							BasicPara.TM_id
							);
			Myeeprom_write_block( (void *)BasicPara.TM_Time, (void *)BP_TM_TIME_ADDR, 6);
			Myeeprom_write_block( (void *)BasicPara.TM_type, (void *)BP_TM_TYPE_ADDR, 4);
			Myeeprom_write_block( (void *)BasicPara.TM_id, (void *)BP_TM_ID_ADDR, 6);

			flag = 1;	
		}
		else
		{
			flag = 0;	
		}
	}
	else if (strcmp(cmd , "TM+BPCN=?\r")==0)//读取中心短信号码
	{		
		dprintf0("\r\n+BPCN: %s\r\nOK\r\n", BasicPara.CenterGsmNum);
		flag = 1;	
	}	
	else if (strstr(cmd , "TM+BPCN=")!=0)//设置中心短信号码
	{
		if (cmdLen == 9+CENTERNUMLEN)
		{
			
			if ((*(cmd+8)=='8')&&(*(cmd+9)=='6'))
			{
				myCopy(cmd, BasicPara.CenterGsmNum, 8, CENTERNUMLEN);
				
				dprintf0("\r\n+BPCN: %s\r\nOK\r\n", BasicPara.CenterGsmNum);
				Myeeprom_write_block( (void *)BasicPara.CenterGsmNum, (void *)BP_TM_CNTNUM_ADDR, 13);

//				sprintf(MySM_PARAM.TP_UD, "01");
//				MySM_PARAM.TP_UDlen = 2;		
//				SendSms(&MySM_PARAM);

				flag = 1;	
			}
			else
			{
				flag = 0;		
			}
		}
		else
		{
			flag = 0;	
		}
	}
	else if (strcmp(cmd , "TM+WPSB?\r")==0)//查询传感器报警门限列表
	{		
		dprintf0("\r\n+WPSB: (1,%d),(0,65535)\r\nOK\r\n", SENSORSNUM);					
		flag = 1;	
	}
	else if (strcmp(cmd , "TM+WPSB=?\r")==0)//查询传感器报警门限
	{		
		myprintf0("\r\n+WPSB: ");
		for(kk=0; kk< (SENSORSNUM-1); kk++)
		{
			dprintf0("%d:%d,", kk+1, WorkPara.SensorsBound[kk]);	
		}	
		dprintf0("%d:%d\r\nOK\r\n", SENSORSNUM, WorkPara.SensorsBound[SENSORSNUM-1]);
				
		flag = 1;	
	}
	else if (strstr(cmd , "TM+WPSB=")!=0)//设置传感器报警门限
	{		
			if (sscanf(cmd, "TM+WPSB=%d,%d\r", &kk, &jj )== 2)
			{	
				if ((kk > SENSORSNUM)||(kk<1))
				{
					flag = 0;	
				}
				else
				{
					WorkPara.SensorsBound[kk-1] = jj;
					dprintf0("\r\n+WPSB: %d,%d\r\nOK\r\n", kk,jj );
					Myeeprom_write_block( (void *)WorkPara.SensorsBound, (void *)WP_SENSORBOUND_ADDR, 32);

					flag = 1;	
				}
			}
			else
			{				
				flag = 0;				
			}
	}
	else if (strcmp(cmd , "TM+WPSW?\r")==0)//查询传感器报警使能列表
	{		
		myprintf0("\r\n+WPSW: (1,16),(0,1)\r\nOK\r\n");					
		flag = 1;	
	}
	else if (strcmp(cmd , "TM+WPSW=?\r")==0)//查询传感器报警使能
	{		
		myprintf0("\r\n+WPSW: ");
		for(kk=0; kk<(SENSORSNUM-1); kk++)
		{
			if (BitCheck(WorkPara.SensorsWarnEnabled[kk/8], kk%8) > 1)dprintf0("%d:1,", kk+1);	
			if (BitCheck(WorkPara.SensorsWarnEnabled[kk/8], kk%8) == 1)dprintf0("%d:0,", kk+1);	
		}	
		if (BitCheck(WorkPara.SensorsWarnEnabled[(SENSORSNUM-1)/8], (SENSORSNUM-1)%8) == 1)dprintf0("%d:0\r\nOK\r\n", SENSORSNUM);	
		if (BitCheck(WorkPara.SensorsWarnEnabled[(SENSORSNUM-1)/8], (SENSORSNUM-1)%8) > 1)dprintf0("%d:1\r\nOK\r\n", SENSORSNUM);	
				
		flag = 1;	
	}
	else if (strstr(cmd , "TM+WPSW=")!=0)//设置传感器报警使能
	{		
			if (sscanf(cmd, "TM+WPSW=%d,%d\r", &kk, &jj) == 2)
			{	
				if ((kk > 16)||(kk<1)||(jj<0)||(jj>1))
				{
					flag = 0;	
				}
				else
				{
					//修改传感器报警使能位
					if (jj==1)
					{
						SetBit(&(WorkPara.SensorsWarnEnabled[(kk-1)/8]), (kk-1)%8);	
					}
					else
					{
						ClearBit(&(WorkPara.SensorsWarnEnabled[(kk-1)/8]), (kk-1)%8);	
					}						
				
					dprintf0("\r\n+WPSW: %d,%d\r\nOK\r\n", kk,jj );
					Myeeprom_write_block( (void *)WorkPara.SensorsWarnEnabled, (void *)WP_SENSORWARNEN_ADDR, 2);

					flag = 1;	
				}
			}
			else
			{				
				flag = 0;				
			}
	}
	else if (strcmp(cmd , "TM+WPSS?\r")==0)//查询开关量正常状态列表
	{		
		myprintf0("\r\n+WPSS: (1,16),(0,1)\r\nOK\r\n");					
		flag = 1;	
	}
	else if (strcmp(cmd , "TM+WPSS=?\r")==0)//查询开关量正常状态
	{		
		myprintf0("\r\n+WPSS: ");
		for(kk=0; kk<(16-1); kk++)
		{
			if (BitCheck(WorkPara.SwitchNomalState[kk/8], kk%8) > 1)
			{
				dprintf0("%d:1,", kk+1);
				continue;	
			}	
			if (BitCheck(WorkPara.SwitchNomalState[kk/8], kk%8) == 1)
			{
				dprintf0("%d:0,", kk+1);	
				continue;
			}
		}	
		if (BitCheck(WorkPara.SwitchNomalState[(16-1)/8], (16-1)%8) == 1)dprintf0("%d:0\r\nOK\r\n", 16);	
		if (BitCheck(WorkPara.SwitchNomalState[(16-1)/8], (16-1)%8) > 1)dprintf0("%d:1\r\nOK\r\n", 16);
				
		flag = 1;	
	}
	else if (strstr(cmd , "TM+WPSS=")!=0)//设置开关量正常状态
	{		
			if (sscanf(cmd, "TM+WPSS=%d,%d\r", &kk, &jj )== 2)
			{	
				if ((kk > 16)||(kk<1)||(jj<0)||(jj>1))
				{
					flag = 0;	
				}
				else
				{
					//修改开关正常状态
					if (jj==1)
					{
						SetBit(&(WorkPara.SwitchNomalState[(kk-1)/8]), (kk-1)%8);						
					}
					else
					{
						ClearBit(&(WorkPara.SwitchNomalState[(kk-1)/8]), (kk-1)%8);							
					}
					dprintf0("\r\n+WPSS: %d,%d\r\nOK\r\n", kk,jj );
					Myeeprom_write_block( (void *)WorkPara.SwitchNomalState, (void *)WP_SWITCHNMSTATE_ADDR, 2);

					flag = 1;	
				}
			}
			else
			{				
				flag = 0;				
			}
	}
	else if (strcmp(cmd , "TM+WPSE?\r")==0)//查询开关量报警使能列表
	{		
		myprintf0("\r\n+WPSE: (1,16),(0,1)\r\nOK\r\n");					
		flag = 1;	
	}
	else if (strcmp(cmd , "TM+WPSE=?\r")==0)//查询开关量报警使能
	{		
		myprintf0("\r\n+WPSE: ");
		for(kk=0; kk<(16-1); kk++)
		{
			if (BitCheck(WorkPara.SwitchWarnEnable[kk/8], kk%8) > 1)
			{
				dprintf0("%d:1,", kk+1);	
				continue;
			}
			if (BitCheck(WorkPara.SwitchWarnEnable[kk/8], kk%8) == 1)
			{
				dprintf0("%d:0,", kk+1);	
				continue;
			}
		}	
		if (BitCheck(WorkPara.SwitchWarnEnable[(16-1)/8], (16-1)%8) > 1)dprintf0("%d:1\r\nOK\r\n", 16);	
		if (BitCheck(WorkPara.SwitchWarnEnable[(16-1)/8], (16-1)%8) == 1)dprintf0("%d:0\r\nOK\r\n", 16);	
				
		flag = 1;	
	}
	else if (strstr(cmd , "TM+WPSE=")!=0)//设置开关量报警使能
	{		
			if (sscanf(cmd, "TM+WPSE=%d,%d\r", &kk, &jj )== 2)
			{	
				if ((kk > 16)||(kk<1)||(jj<0)||(jj>1))
				{
					flag = 0;	
				}
				else
				{
					//修改开关量报警使能
					if (jj==1)
					{
						SetBit(&(WorkPara.SwitchWarnEnable[(kk-1)/8]), (kk-1)%8);	
					}
					else
					{
						ClearBit(&(WorkPara.SwitchWarnEnable[(kk-1)/8]), (kk-1)%8);	
					}
					dprintf0("\r\n+WPSE: %d,%d\r\nOK\r\n", kk,jj );
					Myeeprom_write_block( (void *)WorkPara.SwitchWarnEnable, (void *)WP_SWITCHWARNEN_ADDR, 2);

					flag = 1;	
				}
			}
			else
			{				
				flag = 0;				
			}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -