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

📄 sub_c.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 5 页
字号:

/********************************************************\
*	文件名:  Sub_C.C
*	创建时间:2004年12月7日
*	创建人:  
*	版本号:  1.00
*	功能:	  包括一些公共能调用的子程序部分
*	文件属性:公共文件
*	修改历史:(每条详述)

\********************************************************/
#include <msp430x14x.h>
#include "Sub_C.h"
#include "General.h"
#include "Define_Bit.h"
#include "SPI45DB041.h"
#include "D_Buffer.h"
#include "Other_Define.h"
#include "M22_AT.h"
#include "Check_GSM.h"
#include "W_Protocol.h"
#include "Do_Other.h"
#include "TA_Uart.h"
#include "Handle_Protocol.h"
#include "Uart01.h"
#include "Do_SRAM.h"
#include "Msp430_Flash.h"
/*
#include "Do_GSM.h"
#include "Main_Init.h"
#include "Do_Reset.h"
#include "Do_Handle.h"
#include "Do_GPS.h"
#include "Do_Disp.h"
#include "Msp430_Flash.h"
*/
void Check_Flash(unsigned int Add_Sector);
void Write_Phone_Buffer2(unsigned char Add_Flag);
//#define Debug_GSM_COM1

/********************************************************\
*	函数名:ASCII
	作用域:外部文件调用
*	功能:  将一个数转换ASCII数值比如数值1,转换完后的结果为0x31
*	参数:  Input
*	返回值:char  一个ASCII字符的数值
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
unsigned char ASCII( unsigned char Input )
{
	if( Input>9 ) return( Input+0x37 );
	else return( Input+0x30 );
}
/********************************************************\
*	函数名:ASCIITOHEX
	作用域:外部文件调用
*	功能:  将ASCII字符转换为16进制的数比如0x31,0x32,转换完后返回的结果为12
*	参数:  Input_H,Input_L
*	返回值:char 一个16进制的数
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
unsigned char ASCIITOHEX( unsigned char Input_H,unsigned char Input_L )
{
    if( Input_H>0x39 ) Input_H=Input_H-0x37;
    else Input_H=Input_H-0x30;
    if( Input_L>0x39 ) Input_L=Input_L-0x37;
    else Input_L=Input_L-0x30;
    return( Input_H*16+Input_L );
}
/********************************************************\
*	函数名:Compare_String
	作用域:外部文件调用
*	功能:  比较两个字符串是否相同
*	参数:  *Source 需要比较的字符串的的头指针
            *Target 用来做比较标准的字符串头指针
             Count  需要比较的长

*	返回值:0	表示比较结果不相同
            1   表示比较结果相同

*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
unsigned char Compare_String(unsigned char *Source,unsigned char *Target,unsigned int Count )
{
    while(Count>0)
    {
        if((*Source)!=(*Target)) return(0);
        Source++;
        Target++;
        Count--;
    }
    return(1);
}
/********************************************************\
*	函数名:Reset_Variable
	作用域:外部文件调用
*	功能:  设置能进入复位G20的一些参数变量
*	参数:

*	返回值:

*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Reset_Variable(void)
{
	unsigned int i=0;
	gGeneral_Flag|=RESET_GSM_ON_F_1;
	gReset_M22_On_Setp=1;
	gGeneral_Flag&=~LAND_TCP_F_1;
	gM22_Status=GSM_WORK;
	gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
	gOther_Flag&=~QUIT_TCP_F_1;
	gM22_GSM_ECHO_Timer=0;
	gLand_Interval_Timer=0;
	gTCP_FF0D_Send_Timer=0;
	gGPS_No_Output_Timer=0;
	gTimer_GSM_AT=0;
	gTimer_CSQ=0;
	gGPS_Receive_Over=0;

    gPhone_Status=READY;
	gStatus1_Flag&=~PHONE_ONLINE_F_1;
	gGeneral_Flag&=~DAILING_UP_F_1;
	gGeneral_Flag&=~MONITOR_ON_F_1;
	gGeneral_Flag&=~TCP_PHONE_F_1;
	gGeneral_Flag&=~RING_F_1;
	gGSM_Oper_Type=0;
	gSMS_IN_Step=0;
	gSMS_OUT_Step=0;
	gLand_GPRS_Step=0;
	gGPRS_Data_Step=0;
	gGSM_OTHER_Step=0;
	for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++)
	{
		gReceive0_GSM_Buffer[i]=0;
	}
	gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
	gReceive0_GSM_Buffer_Point=0;
	gReceive0_GSM_Buffer_Move=0;

	gReceive1_Point=SRAM_RECORD_S;

	SRAM_Init();
	SRAM_Write(PHONE_AT_2+0,NULL_2);
	for(i=PHONE_AT_2+1;i<END_SRAM_2;i++)
	{
		SRAM_Write(i,0);
	}
}
/********************************************************\
*	函数名:Clear_Exter_WatchDog
	作用域:外部文件调用
*	功能:  喂狗操作,(外部硬件看门狗的操作)翻转WDI管脚的电平
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Clear_Exter_WatchDog(void)
{
	if( (gOther_Flag&RESET_PROGRAME_F_1)==0 )
	{
		if(P6IN&WDI)
		{
			P6OUT&=~WDI;		//如果是高电位,则翻转为低电位
		}
		else
		{
			P6OUT|=WDI;			//如果是低电位,则翻转为高电位
		}
	}
}
/********************************************************\
*	函数名:Wait_OK
	作用域:本文件调用
*	功能:  判断大多的AT指令是否返回OK
*	参数:  无
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Wait_OK(void)
{
	gTimer=0;
	while(gTimer<5000)
	{
		Clear_Exter_WatchDog();
		if(Check_GSM()!=0)
		{
		    if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK))!=0)
		    {
		    	gInternal_Flag|=M22_RETURN_OK_1;
		    	break;
		    }
		    else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
		    {
		    	break;
		    }
		}
	}
}
/********************************************************\
*	函数名:Copy_String
	作用域:外部文件调用
*	功能:  移动
*	参数:  无
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Copy_String( unsigned char *PS,unsigned char *PD,unsigned int COUNT )
{
    unsigned int i;
    for( i=0;i<COUNT;i++ )
    {
        *(PD+i)=*(PS+i);
    }
}

/********************************************************\
*	函数名:Write_PartData_Buffer1()
	作用域:外部文件调用
*	功能:
*	参数:  无
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
/********************************************************\
*	函数名:Write_PartData_Sram()
	作用域:外部文件调用
*	功能:
*	参数:  无
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Write_PartData_Sram(unsigned int S_Address)
{
	unsigned char nFlag;
	nFlag=gAlarm_Type;
	//4个字节的经度
	SRAM_Write(S_Address+1,gLongitude/0x1000000);
	SRAM_Write(S_Address+2,gLongitude%0x1000000/0x10000);
	SRAM_Write(S_Address+3,gLongitude%0x10000/0x100);
	SRAM_Write(S_Address+4,gLongitude%0x100);
	//4个字节的纬度
	SRAM_Write(S_Address+5,gLatitude/0x1000000);
	SRAM_Write(S_Address+6,gLatitude%0x1000000/0x10000);
	SRAM_Write(S_Address+7,gLatitude%0x10000/0x100);
	SRAM_Write(S_Address+8,gLatitude%0x100);
	//速度,角度
	SRAM_Write(S_Address+9,gSpeed);
	SRAM_Write(S_Address+10,gAzimuth);

	//Flag标志位(判断是否GPS有效果)
	if(gGeneral_Flag&GPS_VALID_F_1)	nFlag|=FLAG_GPSVAILD_1;
	else							nFlag&=~FLAG_GPSVAILD_1;
	SRAM_Write(S_Address+11,nFlag);
	//时间,年,月,日,时,分,秒
	SRAM_Write(S_Address+12,gYear);
	SRAM_Write(S_Address+13,gMonth);
	SRAM_Write(S_Address+14,gDate);
	SRAM_Write(S_Address+15,gHour);
	SRAM_Write(S_Address+16,gMinute);
	SRAM_Write(S_Address+17,gSecond);
}

/********************************************************\
*	函数名:Write_PartData_Buffer1()
	作用域:外部文件调用
*	功能:
*	参数:  无
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Page_R_Write_Check(unsigned int Page)
{
	unsigned int i=0,j=0;
	OperateSPIEnd();
	j=ReadByteFromBuffer2(0);
	for(i=1;i<254;i++)	j+=ReadNextFromBuffer2();
	OperateSPIEnd();
	WriteOneByteToBuffer2(254,j/256);
	WriteNextByteToBuffer2(j%256);
	OperateSPIEnd();
	//将重新计算过的buffer2数据写入扇区0
	P6OUT|=SPI45DB041_WP;
	WriteBuffer2ToPage(Page);
	P6OUT&=~SPI45DB041_WP;
	OperateSPIEnd();
}

/********************************************************\
*	函数名:Send_STOP_DealWay()
	作用域:外部文件调用
*	功能:
*	参数:  无
*	返回值: 无
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Send_STOP_DealWay(unsigned char nCommand,unsigned char nACK)
{
	unsigned char VCommand=0;
	VCommand=nCommand;
	SRAM_Init();
	SRAM_Write(ECHO_SMS_2+0,VAILD_2);
	SRAM_Write(ECHO_SMS_2+1,VCommand);
	SRAM_Write(ECHO_SMS_2+2,nACK);
	SRAM_Write(ECHO_SMS_2+3,28);
	SRAM_Write(ECHO_SMS_2+4,0);

	SRAM_Write(ECHO_SMS_2+5,gYear);
	SRAM_Write(ECHO_SMS_2+6,gMonth);
	SRAM_Write(ECHO_SMS_2+7,gDate);
	SRAM_Write(ECHO_SMS_2+8,gHour);
	SRAM_Write(ECHO_SMS_2+9,gMinute);
	SRAM_Write(ECHO_SMS_2+10,gSecond);
	//经度,纬度,速度,角度,报警标志,当前时间
	Write_PartData_Sram(ECHO_SMS_2+10);
	SRAM_Write(ECHO_SMS_2+10+18,0);
	SRAM_Write(ECHO_SMS_2+10+19,gStatus3_Flag);
	SRAM_Write(ECHO_SMS_2+10+20,gStatus2_Flag);
	SRAM_Write(ECHO_SMS_2+10+21,gStatus1_Flag);

	Judge_SMS_Way();
}

/********************************************************\
*	函数名:Disp_Handle_Steal_Alarm_Echo()
	作用域:本地文件调用
*	功能:	接收到来自显示终端主动改变密码的信令
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Disp_Handle_Steal_Alarm_Echo(void)
{
	//密码连续超过3次错误,则产生被盗报警
	//将被盗报警信息存储在Flash中
	gAlarm_Type=STEAL_ALARM;
	gSMS_ACK[ALARM_ACK]=0;
	OperateSPIEnd();
	ReadOnePageToBuffer2(FLASH_INFO2_ONE_2);
	OperateSPIEnd();
	WriteOneByteToBuffer2(ALARM_F_2,STEAL_ALARM);
	WriteNextByteToBuffer2( (char)(~STEAL_ALARM) );
	OperateSPIEnd();
	gCycle_Alarm=ALARM_CIRCLE_TIME;
	RFlash_Sector(FLASH_INFO2_ONE_2);
	gCycle_Send_Status=ALARM_DATA;
	gCircle_Timer=0;
	gSMS_ACK[ALARM_ACK]=0;
	Circle_Data_TCP(ALARM_UP,gSMS_ACK[ALARM_ACK]);
	gInternal_Flag|=SEND_CIRCLE_F_1;
	Judge_SMS_Way();
}
/********************************************************\
*	函数名:Load_Flash_Par_Buffer1()
	作用域:本地文件调用
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void  Load_Flash_Par_Buffer1(void)
{
	unsigned int i=0;
	unsigned char Check_Data=0;
	//车型,车类,车组,车号的处理
	OperateSPIEnd();
	ReadOnePageToBuffer2(FLASH_INFO1_ONE_2);
	OperateSPIEnd();
	gType=ReadByteFromBuffer2(VEH_TYPE_2);
	gKind=ReadNextFromBuffer2();
	gGroup=ReadNextFromBuffer2();
	gVID = ReadNextFromBuffer2();
	gVID<<=8;
	gVID += ReadNextFromBuffer2();
	OperateSPIEnd();

	//1,目标号码1的处理
	gGeneral_Buffer[TARGET_NUMBER1_2]=ReadByteFromBuffer2(TARGET_NUMBER1_F_2);	//读目标电话号码的长度
	Check_Data=0;
	if( (gGeneral_Buffer[TARGET_NUMBER1_2]>=1)&&(gGeneral_Buffer[TARGET_NUMBER1_2]<=16) )
	{
		gGeneral_Flag|=NUM1_VAILD_F_1;
		for(i=1;i<=gGeneral_Buffer[TARGET_NUMBER1_2];i++)						//不包括长度本身整个目标电话号码的长度
		{
			gGeneral_Buffer[i+TARGET_NUMBER1_2]=ReadNextFromBuffer2();			//目标电话号码的第一个字节
			Check_Data += gGeneral_Buffer[i+TARGET_NUMBER1_2];
		}
		gGeneral_Buffer[TARGET_NUMBER1_CHECK_2]=Check_Data;
		OperateSPIEnd();
		if( (gGeneral_Buffer[TARGET_NUMBER1_2+1]>'9')||(gGeneral_Buffer[TARGET_NUMBER1_2+1]<'0') )
		{
			gGeneral_Flag&=~NUM1_VAILD_F_1;
		}
	}
	else
	{
		gGeneral_Flag&=~NUM1_VAILD_F_1;
	}

⌨️ 快捷键说明

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