?? 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 + -