📄 sub_c.c
字号:
/********************************************************\
* 文件名: 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 + -