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

📄 do_reset.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		if(gTimer_GSM_AT>1000)
		{
			Send_COM0_String((unsigned char *)AT_CMGD,sizeof(AT_CMGD));
			Send_COM0_Byte('1');
			Send_COM0_Byte(',');
			Send_COM0_Byte('4');
			Send_COM0_Byte(0x0d);
			gTimer_GSM_AT=0;
			gReset_M22_On_Setp=36;
		}
		else	Check_GSM();
	}
	else if(gReset_M22_On_Setp==36)
	{
		Wait_Return_M22(37);
	}
	//18,AT+CMGD=1,4
	else if(gReset_M22_On_Setp==37)
	{
		if(gTimer_GSM_AT>1000)
		{
			Send_COM0_String((unsigned char *)AT_CMGD,sizeof(AT_CMGD));
			Send_COM0_Byte('1');
			Send_COM0_Byte(',');
			Send_COM0_Byte('4');
			Send_COM0_Byte(0x0d);
			gTimer_GSM_AT=0;
			gReset_M22_On_Setp=38;
		}
		else	Check_GSM();
	}
	else if(gReset_M22_On_Setp==38)
	{
		Wait_Return_M22(39);
	}
	//19,显示程序的时间和作者
	else if(gReset_M22_On_Setp==39)
	{
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		//开发商:哈工大泰森电子有限公司
		Send_COM1_String( (unsigned char *)MADE,sizeof(MADE) );
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		//开发着:
		Send_COM1_String( (unsigned char *)AUTHOR,sizeof(AUTHOR) );
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		//产品型号:
		Send_COM1_String( (unsigned char *)MODEL,sizeof(MODEL) );
		Send_COM1_Byte(':');
		Send_COM1_String( (unsigned char *)MODEL_TYPE2,sizeof(MODEL_TYPE2) );
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		//开发日期
		Send_COM1_String( (unsigned char *)DESIGN_DATA,sizeof(DESIGN_DATA) );
		Send_COM1_String( (unsigned char *)EDIT_DATE,sizeof(EDIT_DATE) );
		//软件版本
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		Send_COM1_String( (unsigned char *)SOFT_EDITION,sizeof(SOFT_EDITION) );
		Send_COM1_String( (unsigned char *)GPS_2005A,sizeof(GPS_2005A) );
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
		Send_COM1_String( (unsigned char *)UPDATE_TIME,sizeof(UPDATE_TIME) );
		Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);

		gReset_M22_On_Setp=40;
	}
	//20,M22初始化完成
	else if(gReset_M22_On_Setp==40)
	{
		gReset_M22_On_Setp=0;
		gGeneral_Flag&=~RESET_GSM_ON_F_1;
		gM22_Status=GSM_WORK;
		gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
		gGSM_Oper_Type=GSM_PHONE;
		gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
		gPhone_Step=0;gTimer_GSM_AT=0;

		Send_COM1_String( (unsigned char *)M22_RESET_ON_OK,sizeof(M22_RESET_ON_OK) );

		gReceive1_Point=SRAM_RECORD_S;

		SRAM_Init();
		SRAM_Write(PHONE_AT_2+0,NULL_2);
		for(i=PHONE_AT_2+1;i<ECHO_SMS_2;i++)
		{
			SRAM_Write(i,0);
		}
		gInternal_Flag|=DISP_ON_F_1;
		gStatus1_Flag|=DISPLAY_ON_F_1;
		gTimer=0;
		while(gTimer<1000){Check_GSM();Clear_Exter_WatchDog();}
		gRecord_Data_Timer=0;
		gTimer_CSQ=GSM_CHECKCSQ_TIME+1;
		SRAM_Init();
		SRAM_Write(SHANDLE_DATA_VAILD,NULL_2);
		gCheck_Par_Timer=CHECK_SYS_PAR_TIME+1;
	}
}
/********************************************************\
*	函数名:Ask_SMS_Send
	作用域:外部文件调用
*	功能:  在进行SMS的发送操作AT+CMGS=L(长度)
*	参数:  Input
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Ask_SMS_Send(unsigned char nInput)
{
	Send_COM0_String((unsigned char *)AT_CMGS,sizeof(AT_CMGS));
	Send_COM0_Byte(ASCII(nInput/100));
	Send_COM0_Byte(ASCII((nInput%100)/10));
	Send_COM0_Byte(ASCII(nInput%10));
	Send_COM0_Byte(0x0d);
}

/********************************************************\
*	函数名:Send_SMS_Head
	作用域:外部文件调用
*	功能:  根据SMS的标准格式,这里是将短消息中心号码,目标电话号码,协议格式
			发送到GSM模块
*	参数:  I
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
	发送SMS的头,包括短消息中心号码在内的固定长度
	注意这里的头与在G18里不一样,必须将短消息中心号码在数据包头中

	AT+CMGS=27
	>
	0891683108705505F011000D91683167108230F70008000CFF4FB008000101000102090D

    在这个子模块中发送的数据则为0891683108705505F011000D91683167108230F7000800
    这个部分只所有发送SMS数据的公共部分。在这个项目文件中,只要短消息中心号码
    和目标电话号码不变,则这部分的发送数据一样。
    0CFF4FB008000101000102090D 这部分属于数据区。会由后面的程序处理。

	这里27的长度是指11000D91683167108230F70008000CFF4FB008000101000102090D

	AT+CSCA?
	+CSCA: "+8613800755500",145

	OK

\********************************************************/
void Send_SMS_Head(void)
{
	unsigned int i,j,k,x;
	//读短消息中心号码的长度+8613800755500(11位)
	SRAM_Init();
	j=SRAM_Read(CENTER_NUM_2);
	//判断是否有+号
	i=SRAM_Read(CENTER_NUM_2+1);
	if(i=='+')
	{
		k=(j+1)/2+1;gInternal_Flag&=~SMS_CENTER_CLASS_1;	//送91
	}
	else
	{
		k=(j+1)/2+2;gInternal_Flag|=SMS_CENTER_CLASS_1;		//送A1
	}
	//发送号码的长度
	Send_COM0_Byte(ASCII(k/16));
	Send_COM0_Byte(ASCII(k%16));
	if(gInternal_Flag&SMS_CENTER_CLASS_1)	Send_COM0_Byte('A');
	else									Send_COM0_Byte('9');
	Send_COM0_Byte('1');
	//送A1,不带+,则前面的i也是正常的有效发送数据
	if(gInternal_Flag&SMS_CENTER_CLASS_1)
	{
		k=i;
		x=SRAM_Read(CENTER_NUM_2+2);
		Send_COM0_Byte(x);
		Send_COM0_Byte(k);
		i=3;
	}
	//送91,前面带+
	else
	{
		k=SRAM_Read(CENTER_NUM_2+2);
		x=SRAM_Read(CENTER_NUM_2+3);
		Send_COM0_Byte(x);
		Send_COM0_Byte(k);
		i=4;
	}
	while(1)
	{
		if(i<j)//如上例这里j=11
		{
			k=SRAM_Read(CENTER_NUM_2+i);
			x=SRAM_Read(CENTER_NUM_2+i+1);
			Send_COM0_Byte(x);
			Send_COM0_Byte(k);
			i++;
			i++;
		}
		//发送短消息中心号码的最后一个字节0
		else if(i==j)
		{
			k=SRAM_Read(CENTER_NUM_2+i);
			Send_COM0_Byte('F');
			Send_COM0_Byte(k);
			break;
		}
		else break;
	}
	// 发送1100 (如上例子),这个在所有的协议中均一致
	for(i=0;i<sizeof(SMS_Head_1);i++)
	{
		Send_COM0_Byte(SMS_Head_1[i]);
	}
	//++++++++++++++++++++++++++++++++++++++++++++++
	//发送目标电话号码
	//分析:如果存储为 14,'+','8','6','1','3','6','7','0','1','5','5','7','0','4'
	//或者存储为		13,'8','6','1','3','6','7','0','1','5','5','7','0','4'
	j=SRAM_Read(TARGET_NUMBER1_2);
	i=SRAM_Read(TARGET_NUMBER1_2+1);
	if(i=='+')
	{
		k=j-1;gInternal_Flag&=~SMS_TARGET_CLASS_1;
	}
	else
	{
		k=j;gInternal_Flag|=SMS_TARGET_CLASS_1;
	}
	Send_COM0_Byte(ASCII(k/16));
	Send_COM0_Byte(ASCII(k%16));

	if(gInternal_Flag&SMS_TARGET_CLASS_1)	Send_COM0_Byte('A');
	else									Send_COM0_Byte('9');
	Send_COM0_Byte('1');
	//送A1,不带+,则前面的i也是正常的有效发送数据
	if(gInternal_Flag&SMS_TARGET_CLASS_1)
	{
		k=i;
		x=SRAM_Read(TARGET_NUMBER1_2+2);
		Send_COM0_Byte(x);
		Send_COM0_Byte(k);
		i=3;
	}
	else									//送91,前面带+
	{
		k=SRAM_Read(TARGET_NUMBER1_2+2);
		x=SRAM_Read(TARGET_NUMBER1_2+3);
		Send_COM0_Byte(x);
		Send_COM0_Byte(k);
		i=4;
	}
	while(1)
	{
		if(i<j)
		{
			k=SRAM_Read(TARGET_NUMBER1_2+i);
			x=SRAM_Read(TARGET_NUMBER1_2+i+1);
			Send_COM0_Byte(x);
			Send_COM0_Byte(k);
			i++;
			i++;
		}
		//目标电话号码的最后一个字节
		else if(i==j)
		{
			k=SRAM_Read(TARGET_NUMBER1_2+i);
			Send_COM0_Byte('F');
			Send_COM0_Byte(k);
			OperateSPIEnd();
			break;
		}
		else break;
	}
	OperateSPIEnd();
	// 发送短消息的协议方式(如上例子),这个在所有的协议中均一致
	for( i=0;i<6;i++ )
	{
		Send_COM0_Byte(SMS_Head_2[i]);
	}
}

/********************************************************\
*	函数名:Send_Echo_GSM_Head
	作用域:外部文件调用
*	功能:

*	参数:  nInput 			如果属于SMS的发送,则这个参数表示整个数据包的长度
 			nCommand		数据包中的命令字
 			nACK			ACK响应,如果是属于主动发送的上行数据包,则ACK=0
 			nLength			指的是在数据包中从消息号到CHK以前的数据的字节数

*	返回值: iCheckOut  		这部分发送数据的和(用来计算校验核)
*	创建人:
*
*	修改历史:(每条详述)

	补充说明:具体在buffer1中存储第2类SMS的数据形式如下:0x7B----0xB6(整个分配的区域大小)
			  0x7B	存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,
			  		为0则表示已经处理完了SMS
			  0x7C	存储数据包的命令字在这里则为nCommand
			  0x7D	存储数据包的ACK的值ACK
			  0x7E	存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
			  0x7F  从这开始存储数据包

	AT+CMGS=27
	>
	0891683108705505F011000D91683167108230F70008000CFF4FB008000101000102090D

	这里27的长度是指的是从1100 0D 91 68 3167108230F7 000800 0C FF4FB008000101000102090D
										13760128037
	所以Send_Echo_Head_1子模块的几个参数的计算方式如下:
	nInput的计算方式:	nInput=12+(0x7d)
	nCommand的附值方式:nCommand=(0x7C)
	nACK的附值方式:	nACK=(0x7E)
	nLength的附值方式:	nLength=nInput-4

	根据上面的描述,在发送第二累SMS的时候,AT+CMGS=后面跟的数据的长度的计算方式则为

	(目标号码长度+1)/2+8+12+(0x7E)
	则根据上面的例子,目标号码为13760128037为11位.  8 是指的1100 0D 91 68 000800的长度
					  12指的是0C的长度,因为这是属于第一类的SMS的格式,数据长度为0,
					  但在在第二类的SMS中还需要加上数据区的长度,在这里存储在buffer1中的0x7e区域

\********************************************************/
unsigned int Send_Echo_GSM_Head(unsigned char nInput,unsigned char nCommand,unsigned char nACK,unsigned char nLength)
{
	unsigned int iCheckOut=0;
	Send_COM0_Byte(ASCII(nInput/0x10));
	Send_COM0_Byte(ASCII(nInput%0x10));
	iCheckOut=0;
	Send_COM0_Byte(ASCII(SOH/0x10));
	Send_COM0_Byte(ASCII(SOH%0x10));
	iCheckOut+=SOH;
	Send_COM0_Byte(ASCII((char)nCommand/0x10));
	Send_COM0_Byte(ASCII((char)nCommand%0x10));
	iCheckOut+=(char)nCommand;
	Send_COM0_Byte(ASCII((char)(~nCommand)/0x10));
	Send_COM0_Byte(ASCII((char)(~nCommand)%0x10));
	iCheckOut+=(char)(~nCommand);
	Send_COM0_Byte(ASCII((nLength)/0x10));
	Send_COM0_Byte(ASCII((nLength)%0x10));
	iCheckOut+=(nInput-4);
	Send_COM0_Byte(ASCII(nACK/0x10));		//ACK响应字符
	Send_COM0_Byte(ASCII(nACK%0x10));
	iCheckOut+=nACK;
	Send_COM0_Byte(ASCII(gKind/0x10));
	Send_COM0_Byte(ASCII(gKind%0x10));
	iCheckOut+=gKind;
	Send_COM0_Byte(ASCII(gGroup/0x10));
	Send_COM0_Byte(ASCII(gGroup%0x10));
	iCheckOut+=gGroup;
	Send_COM0_Byte(ASCII(gVID/0x1000));
	Send_COM0_Byte(ASCII(gVID%0x1000/0x100));
	iCheckOut+=gVID/0x100;
	Send_COM0_Byte(ASCII(gVID%0x100/0x10));
	Send_COM0_Byte(ASCII(gVID%0x10));
	iCheckOut+=gVID%0x100;
	return(iCheckOut);
	//iCheckOut为计算前面发送部分的数据的校验和。如果后面还有更多的数据
	//在计算整个校验核的时候则要继续这个数据一起计算在内
}
/********************************************************\
*	函数名:Send_Echo_TCP_Head
	作用域:外部文件调用
*	功能:
*	参数: iCheckIn	前面计算的校验核
		   nAddress 需要发送数据在buffer1中的首地址
		   nLength	需要发送的数据在buffer1中的长度

*	返回值: iCheckOut  这部分发送数据的和(用来计算校验核)
*	创建人:
*
*	修改历史:(每条详述)

\********************************************************/
unsigned int Send_Echo_TCP_Head(unsigned char nInput,unsigned char nCommand,unsigned char nACK,unsigned char nLength)
{
	unsigned int iCheckOut=0;
	iCheckOut=nInput;
	iCheckOut=0;
	Send_COM0_Byte(SOH);
	iCheckOut+=SOH;
	Send_COM0_Byte( nCommand );
	iCheckOut+= nCommand;
	Send_COM0_Byte( (char)(~nCommand) );
	iCheckOut+=(char)(~nCommand);
	Send_COM0_Byte( nLength );
	iCheckOut+=nLength;
	Send_COM0_Byte( nACK );
	iCheckOut+=nACK;
	Send_COM0_Byte( gKind );
	iCheckOut+=gKind;
	Send_COM0_Byte( gGroup );
	iCheckOut+=gGroup;
	Send_COM0_Byte( gVID/0x100 );
	iCheckOut+=gVID/0x100;
	Send_COM0_Byte( gVID%0x100 );
	iCheckOut+=gVID%0x100;
	return(iCheckOut);
	//iCheckOut为计算前面发送部分的数据的校验和。如果后面还有更多的数据
	//在计算整个校验核的时候则要继续这个数据一起计算在内
}
/********************************************************\
*	函数名:Send_Buffer1_GSM_Data
	作用域:外部文件调用
*	功能: 打包发送存储在buffer1中的数据区的数据。并计算校验核
*	参数: iCheckIn	前面计算的校验核
		   nAddress 需要发送数据在buffer1中的首地址
		   nLength	需要发送的数据在buffer1中的长度

*	返回值: iCheckOut  这部分发送数据的和(用来计算校验核)
*	创建人:
*
*	修改历史:(每条详述)

\********************************************************/
unsigned int Send_Buffer1_GSM_Data(unsigned int iCheckIn,unsigned char nAddress,unsigned char nLength)
{
	unsigned int iCheckOut,i;
	unsigned char Data_Temp;
	OperateSPIEnd();
	iCheckOut=iCheckIn;
	if(nLength>0)
	{
		Data_Temp=SRAM_Read(nAddress);
		iCheckOut += Data_Temp;
		Send_COM0_Byte(ASCII(Data_Temp/0x10));
		Send_COM0_Byte(ASCII(Data_Temp%0x10));
		for(i=1;i<nLength;i++)
		{
			Data_Temp=SRAM_Read(nAddress+i);
			iCheckOut += Data_Temp;
			Send_COM0_Byte(ASCII(Data_Temp/0x10));
			Send_COM0_Byte(ASCII(Data_Temp%0x10));
		}
	}
	OperateSPIEnd();
	return(iCheckOut);
}
/********************************************************\
*	函数名:Send_Buffer1_TCP_Data
	作用域:外部文件调用
*	功能: 打包发送存储在buffer1中的数据区的数据。并计算校验核
*	参数: iCheckIn	前面计算的校验核
		   nAddress 需要发送数据在buffer1中的首地址
		   nLength	需要发送的数据在buffer1中的长度

*	返回值: iCheckOut  这部分发送数据的和(用来计算校验核)
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
unsigned int Send_Buffer1_TCP_Data(unsigned int iCheckIn,unsigned char nAddress,unsigned char nLength)
{
	unsigned int iCheckOut,i;
	unsigned char Data_Temp;
	OperateSPIEnd();
	iCheckOut=iCheckIn;
	if(nLength>0)
	{
		Data_Temp=SRAM_Read(nAddress);
		iCheckOut += Data_Temp;
		Send_COM0_Byte( Data_Temp );
		for(i=1;i<nLength;i++)
		{
			Data_Temp=SRAM_Read(nAddress+i);
			iCheckOut += Data_Temp;
			Send_COM0_Byte( Data_Temp );
		}
	}
	OperateSPIEnd();
	return(iCheckOut);
}
/********************************************************\
*	函数名:Send_Echo_TCP_End
	作用域:外部文件调用
*	功能:  进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
			是所有发送SMS,和GPRS数据均可调用的子程序
*	参数:  Input  前面计算的校验核,在这里要发送出去
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Send_Echo_TCP_End(unsigned int iInput)
{
	Send_COM0_Byte( iInput/0x100 );
	Send_COM0_Byte( iInput%0x100 );
	Send_COM0_Byte( EOT );
}
/********************************************************\
*	函数名:Send_Echo_GSM_End
	作用域:外部文件调用
*	功能:  进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
			是所有发送SMS,和GPRS数据均可调用的子程序
*	参数:  Input  前面计算的校验核,在这里要发送出去
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Send_Echo_GSM_End(unsigned int iInput)
{
	Send_COM0_Byte(ASCII(iInput/0x1000));
	Send_COM0_Byte(ASCII(iInput%0x1000/0x100));
	Send_COM0_Byte(ASCII(iInput%0x100/0x10));
	Send_COM0_Byte(ASCII(iInput%0x10));
	Send_COM0_Byte(ASCII(EOT/0x10));
	Send_COM0_Byte(ASCII(EOT%0x10));
}

/********************************************************\
*	函数名:Send_Echo_GSM_End
	作用域:外部文件调用
*	功能:  进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
			是所有发送SMS,和GPRS数据均可调用的子程序
*	参数:  Input  前面计算的校验核,在这里要发送出去
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Wait_Return_M22(unsigned char Next_Step)
{
	if(Check_GSM()!=0)
	{
		gTimer_GSM_AT=0;
	    if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK))!=0)
	    {
	    	gReset_M22_On_Setp=Next_Step;
	    }
	    else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
	    {
	    	gReset_M22_On_Setp=1;
	    }
	}
	else if(gTimer_GSM_AT>3000)
	{
		gReset_M22_On_Setp=1;
	}
}

⌨️ 快捷键说明

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