📄 do_record.c
字号:
/********************************************************\
* 文件名: Do_Record.h
* 创建时间:2005年6月21日
* 创建人:
* 版本号: 1.00
* 功能:
*
* 修改历史:(每条详述)
补充说明:与外接的行使记录仪相连接,串口1,9600,奇校验,全双工通讯方式
\********************************************************/
#include <msp430x14x.h>
#include <stdlib.h>
#include "General.h"
#include "Do_SRAM.h"
#include "D_Buffer.h"
#include "Other_Define.h"
#include "Uart01.h"
#include "Sub_C.h"
#include "Record_Protocol.h"
#include "Define_Bit.h"
#include "M22_AT.h"
#include "Disp_Protocol.h"
#include "Do_Other.h"
#include "W_Protocol.h"
#include "Record_Protocol.h"
#include "TA_Uart.h"
/*
#include "SPI45DB041.h"
#include "W_Protocol.h"
#include "Handle_Protocol.h"
#include "Do_Record.h"
#include "Define_Bit.h"
#include "Main_Init.h"
#include "Check_GSM.h"
#include "Do_Reset.h"
#include "Do_M22.h"
#include "Do_Handle.h"
#include "Do_GPS.h"
#include "Do_Disp.h"
#include "Do_Other.h"
*/
void Deal_Record_Data(unsigned int Length);
unsigned char Check_Record_Time(void);
/********************************************************\
* 函数名:Do_Record_Module()
作用域:外部文件调用
* 功能:
* 参数:
* 返回值:
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
void Do_Record_Module(void)
{
unsigned int i;
unsigned int k;
unsigned char DataTemp=0;
if( (gReceive1_Over_Count>60)&&(gReceive1_Point>SRAM_RECORD_S)&&((gOther_Flag&RECORD_DATA_F_1)==0) )
{
//判断是否正确的数据包
i=gReceive1_Point;
//先判断包尾
if( (SRAM_Read(i-1)==0x0a)&&(SRAM_Read(i-2)==0x0d) )
{
//如果包尾正确,则需要判断包长
k=0;
k=SRAM_Read(SRAM_RECORD_S+4);
k<<=8;
k=k+SRAM_Read(SRAM_RECORD_S+5);
k=k+10;
if( (i-SRAM_RECORD_S)==k )
{
if((gGeneral_Flag&TCP_PHONE_F_1)==0 )
{
#ifdef Debug_GSM_COM1
Send_COM1_Byte(ASCII((i-SRAM_RECORD_S)/0x100));
Send_COM1_Byte(ASCII(((i-SRAM_RECORD_S)%0x100)/0x10));
Send_COM1_Byte(ASCII((i-SRAM_RECORD_S)%0x10));
Send_COM1_Byte(':');
Send_COM1_Byte(ASCII(k/0x100));
Send_COM1_Byte(ASCII((k%0x100)/0x10));
Send_COM1_Byte(ASCII(k%0x10));
Send_COM1_Byte('[');
for(n=SRAM_RECORD_S;n<i;n++)
{
DataTemp=SRAM_Read(n);
Send_COM1_Byte(ASCII(DataTemp/0x10));
Send_COM1_Byte(ASCII(DataTemp%0x10));
Clear_Exter_WatchDog();
}
Send_COM1_Byte(']');
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
#endif
}
Deal_Record_Data(i-SRAM_RECORD_S);
gNO_Sram_Data_Timer=0;
}
}
gReceive1_Point=SRAM_RECORD_S;
}
//如果超过20秒无记录仪的数据发送,则需要清除外部SRAM.
if(gNO_Sram_Data_Timer>20)
{
gNO_Sram_Data_Timer=0;
gReceive1_Point=SRAM_RECORD_S;
gReceive1_Over_Count=0;
Send_COM1_String((unsigned char *)CLEAR_SRAM,sizeof(CLEAR_SRAM));
}
}
/********************************************************\
* 函数名:Deal_Record_Command()
作用域:本地文件调用
* 功能:
* 参数:
* 返回值:
* 创建人:
*
* 修改历史:(每条详述)
补充说明:将接收到的完整的数据包已经放在
外部SRAM的SRAM_DO_S-----SRAM_DO_E区域。
则这个子程序部分是需要将命令字提取并分析出来
\********************************************************/
void Deal_Record_Data(unsigned int Length)
{
unsigned char nCmd=0;
unsigned int iLength=0,i=0;
unsigned char nStatus;
unsigned char nTemp=0;
unsigned char Check_Record=0;
iLength=Length;
SRAM_Init();
nStatus=SRAM_Read(SRAM_RECORD_S);
switch(nStatus)
{
//1,消息类型为0的消息包
case NORMAL_TYPE:
{
gRecord_Data_Timer=0;
gStatus2_Flag&=~RECORD_VAILD_F_1;
gReceive_Record_Info_Timer=0;
gStatus=NORMAL_TYPE;
SRAM_Init();
//读取命令字
nCmd=SRAM_Read(SRAM_RECORD_S+3);
/**************************************************************************************\
1, 返回记录仪发送的记录仪系统数据:信息有,当前速度(米/秒)
年,月,日,时,分,秒,记录仪状态字节1,记录仪状态字节2
补充说明:A:速度需要用来做超速和制动方面的处理。同时定期向显示屏显示
B:如果判断记录仪的时间和GPS有效的状态下,误差超过2秒则,需要对记录仪的时间进行矫正,
同时,如果GPS无效果的状态下,GPS的时间也无效果,则转发记录仪的时间到显示屏。
C:记录仪的状态字节1的信息包括如下: BIT0;间隔距离上发的数据时间到。
BIT1;疲劳驾驶提示标志。
BIT2;疲劳报警标志
BIT3;记录仪打印机的工作状态
BIT4;记录仪USB的工作状态
00 55 7A 40 00 09 00 00 05 09 02 11 37 09 02 00 45 0D 0A
\************************************************************************************/
if(nCmd==K_RECEIVE_RECORDDATA)
{
//1,速度的处理
SRAM_Init();
gSpeed_Record=SRAM_Read(SRAM_RECORD_S+7);
gSpeed_Disp=gSpeed_Record;
gRecord_Null_Count=0;
gPublic_Flag &=~ RECORD_NULL_F_1;
//2,年月日时分秒的处理,如果判断记录仪的时间与GPS的时间误差超过,则需要对记录仪进行时间矫正的设置,但只设置一次
i=Check_Record_Time();
if( (i==1)
&&((gPublic_Flag&CHECK_TIME_F_1)==0) )
{
gPublic_Flag|=SET_RECORD_TIME_F_1;
}
//------------------------------
//3,状态位的处理
gRecord_Status=SRAM_Read(SRAM_RECORD_S+14);
//3-1,判断BIT0,属于需要发送当前定位点的数据
if( (gRecord_Status&J_DISTANCE_DATA_F_1)
&&(gCycle_Send_Status==TRACK_DATA_DISTANCE)
&&((gPublic_Flag&ALLOW_SEND_DISTANCE_F_1)==0) )
{
// Send_COM1_String( (unsigned char *)DISTANCE_DATA,sizeof(DISTANCE_DATA) );
gPublic_Flag|=ALLOW_SEND_DISTANCE_F_1;
}
else
{
if(gPublic_Flag&ALLOW_SEND_DISTANCE_F_1)
{
if( (gInternal_Flag&SEND_CIRCLE_F_1)==0 )
{
Circle_Data_TCP(VEHICLE_RUNDATA_UP,0);
gInternal_Flag|=SEND_CIRCLE_F_1;
gPublic_Flag&=~ALLOW_SEND_DISTANCE_F_1;
//处于GSM的工作方式下
if(gM22_Status==GSM_WORK)
{
//属于常连在线的方式
if((gON_OFF_Temp1&DISTANCE_TCP_ON_1)==0)
{
gInternal_Flag&=~SEND_CIRCLE_F_1;
gInternal_Flag&=~ALLOW_DATA_F_1;
gCircle_Buffer_Point=0;
}
//属于不常在线的方式,则需要登陆
else
{
//在登陆部分有处理和判断
}
}
}
}
}
//3-2,判断BIT1,属于疲劳驾驶提示的标志
if(gRecord_Status&J_TIRE_NOTICE_F_1)
{
gFore_Tire_Count++;
if(gFore_Tire_Count>20)
{
gDisp_Status|=S_TIRE_NOTICE_F_1;
gFore_Tire_Count=0;
}
else
{
gDisp_Status&=~S_TIRE_NOTICE_F_1;
}
}
else
{
gFore_Tire_Count=0;
gDisp_Status&=~S_TIRE_NOTICE_F_1;
}
//3-3,判断BIT2,属于疲劳驾驶报警的标志
if(gRecord_Status&J_TIRE_ALARM_F_1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -