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

📄 main.c

📁 simcom100 GPRS 模块源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
**********************************************************************************************
*
*       文件功能:主程序处理
*
**********************************************************************************************
*/
#define W77E58

#include "myfile.h"
#include "main.h"
#include "can.h"
#include "gprs_program.h"
#include "general.h"
#include "ABSACC.H"

/*
*********************************************************************************************
*
*       所用的全局变量
*
*********************************************************************************************
*/
uchar xdata cg_mSec;
uchar xdata cg_Sec;
uchar xdata cg_Min;
uchar xdata cg_DispStatus;         //显示状态
uchar xdata cg_DispCycTime;        //循环显示时间
uchar xdata cg_DispPeopleCount;    //显示记录的时间
uchar xdata TimeCount;             //时间计时,计数单位(定时器0----20ms)
uchar xdata cg_ExtInter;
uchar xdata cg_CanComId;
uchar xdata cg_CanTarget;
uchar xdata cg_LedBuff[8];         //
uchar xdata cg_GprsComId;          //gprs发送命令ID号
uchar xdata cg_GprsErrorCount;     //gprs出错计数
int   xdata cg_TotalPeople;
uchar xdata cg_CanCheckTime;       //can网络定时检测间隔
uchar xdata cg_GprsCheckTime;      //Gprs网络定时检测间隔
uchar xdata cg_GprsConnectTime;    //gprs 
uchar xdata cg_CanRequireTime;     //can
uchar xdata cg_GprsFlashCount;
uchar xdata cg_GprsTxTimeCount;    //
uchar xdata cg_GprsGpsTxTime;

S_SEND_QUENE xdata sg_CanSendQuene;
S_OVER_TIME  xdata sg_CanOver;
S_TIME       xdata sg_Time;
S_DATE       xdata sg_Date;
S_LED        xdata sg_CanLed;
S_LED        xdata sg_CanLedBuff;
S_LED        xdata sg_GprsLed;
S_LED        xdata sg_GprsLedBuff;

bit bg_Gps;
bit bg_Gprs;
bit bg_Disp;
bit bg_DispPeople;                //显示人数标志
bit bg_CanRst;
bit bg_DataTxGprs;
bit bg_GprsRedStatus;
bit bg_GprsRepeat;                //gprs 重发标志
bit bg_PsmfNew;
bit bg_PsmhNew;
bit bg_GpsFirst;                  //
/*
*********************************************************************************************
*
*       所用到的外部变量
*
*********************************************************************************************
*/
extern bit bg_CanRx;
extern bit bg_GprsRxData;                  //gprs收到一帧数据
extern S_GPRS_COLLECT_REPORT xdata sg_GprsReport;
extern S_GPRS_COLLECT_REPORT xdata sg_GprsCollectReport; 
extern S_SAVE_QUENE  xdata sg_GprsSendQuene;
extern S_PSMF_REPORT   xdata sg_PsmfReport;   //
extern S_PSMF_REPORT   xdata sg_PsmhReport;   //
extern uchar xdata cg_GprsOverCount;
extern bit   bg_GprsOverFlag;
extern uchar xdata cg_GprsRecDataBuff[GPRS_REC_DATA_SIZE];
extern char xdata cg_IpAddr[];
extern char xdata cg_Port[];
extern uchar xdata cg_CanTxTime;
extern bit bg_CanSinger;
extern bit bg_GpsZdaRx;
extern bit bg_GpsRmcRx;
extern bit bg_PsmfNull;
extern bit bg_PsmhNull;
extern bit bg_GprsRst;
extern bit bg_GprsRedFlash;                //gprs 红灯闪烁标志
extern S_SYS_ID xdata sg_Psmf;                //PSMF ID
extern S_SYS_ID xdata sg_Psmh;                //PSMH ID
extern S_SYS_ID xdata sg_Ccm;                 //CCM  ID
extern S_SYS_ID xdata sg_Assm;                //ASSM ID
extern uchar xdata cg_CanErrCount;
extern bit bg_GprsRxByteOver;              //gprs 接收单字节超时标志
extern uchar xdata cg_GprsRxByteCount;     //gprs 接收单字节超时计数
extern long xdata gl_PrevLongi;
extern long xdata gl_PrevLati;
extern uchar xdata gc_GpsErrorCount;

extern ulong xdata gl_GpsError;
extern ulong xdata gl_GpsCorrect;
extern uint xdata gu_GpsIntervalTime;
extern bit bg_GprsRxFirst;                 //接收到gprs第一次回复标志
extern bit bg_GprsRxHead;
extern bit bg_GprsCr;
extern bit bg_GprsRecSE;
extern bit bg_GprsDataHead;
/*
*********************************************************************************************
*
*       所用到的外部函数
*
*********************************************************************************************
*/
extern void CanTxDeal(uchar ComId,uchar Target);
extern void TakeOutDeal(uchar *pComId,uchar *pTarget,S_SEND_QUENE *pSave);
extern uchar CanIni(void);
extern uchar CanTest(void);
extern void CanRxDeal(void);
extern void LedIni(void);
extern void LedDisp(uchar *cl_Data);
extern void delay(uchar i);
extern void SaveDeal( uchar ComId,uchar Target, S_SEND_QUENE *pSave);


extern void GprsSerialIni();
extern uchar GprsStartUp();
extern uchar GprsConnect(uchar *IpAddr, uchar *Port);
extern void GprsTxDeal(ComId);
extern void GprsRxDeal(void);
extern void TakeOutQuene(uchar *pComId, S_SAVE_QUENE *pSave);
extern void SendComm(uchar ComId, S_SAVE_QUENE *pSaveQuene);
extern void GpsFormat(void);
extern void Extint0(uchar cl_Buff);
extern void GpsDataSelect(void);

/*
*********************************************************************************************
*
*       定义的内部函数
*
*********************************************************************************************
*/
void DispError(uchar n);
void LedClear();  
void DispDeal(uchar n);
void LightDeal(void);
uchar GprsRepeatConnect(void);
/*
*********************************************************************************************
*
*       主程序处理
*
*********************************************************************************************
*/
void main(void)
{
	uchar i;
    uchar cl_Buff;

#ifdef W77E58
	// CD1CD0=01, 4 Clocks/Machine , 10 -- 64 clocks/machine, 11 -- 1024
	PMR = 0x40;
	// select external osc.
	EXIF = 0x08;

	// no baud rate double
	PCON = 0;
	
	// 1/12 clock source
	
	CKCON &= 0xef;
#endif
	// no use
	T2CON = 0x34;
	// Gate C/T  M1M0 = 01, 18 bits, no prescale
	TMOD = 0x21;
//#endif 
	bg_Disp = 1;
	//cg_ExtInter = 0x20;
	// EXT_INTER = cg_ExtInter;  
	sg_GprsCollectReport.Time.Sec = 0x01; 
	sg_GprsCollectReport.Time.Min = 0x02; 
	sg_GprsCollectReport.Time.Hour = 15; 
	
	sg_GprsCollectReport.Date.Year = 2004; 
	sg_GprsCollectReport.Date.Month = 5; 
	sg_GprsCollectReport.Date.Day = 8; 
	sg_GprsCollectReport.Date.Week = 6; 
	
	sg_GprsCollectReport.PassengerStat.In = 6; 
	sg_GprsCollectReport.PassengerStat.Out = 9; 
	sg_GprsCollectReport.PassengerStat.Door = 0; 
	sg_GprsCollectReport.GpsInfo.Longitude = 121 * 600000; 
	sg_GprsCollectReport.GpsInfo.Latitude = 31 * 600000;
	sg_GprsCollectReport.GpsInfo.Altitude = 300; 
	sg_GprsCollectReport.GpsInfo.Speed = 400; 
	sg_GprsCollectReport.GpsInfo.Direction = 180; 
	sg_GprsCollectReport.GpsInfo.Flag = 'V'; 
	
	
	sg_GprsReport.GpsInfo.Longitude = 121 * 600000; 
	sg_GprsReport.GpsInfo.Latitude = 31 * 600000;
	sg_GprsReport.GpsInfo.Altitude = 300; 
	sg_GprsReport.GpsInfo.Speed = 400; 
	sg_GprsReport.GpsInfo.Direction = 180; 
	sg_GprsReport.GpsInfo.Flag = 0; 
   
    cg_DispPeopleCount = 0;
    sg_CanLed.GreenOn = 0;                  //初始化can指示灯
    sg_CanLed.GreenOff = 0;
    sg_CanLed.RedOn   = CAN_LED_NORMAL_ON;
    sg_CanLed.RedOff  = CAN_LED_NORMAL_OFF;
	sg_CanLedBuff.GreenOn = 0;
	sg_CanLedBuff.GreenOff = 0;
	sg_CanLedBuff.RedOn = 0;
	sg_CanLedBuff.RedOff = 0;
 
 
 	sg_Psmf.Id = 0xff;
 	sg_Psmh.Id = 0xff;

	sg_PsmhReport.In = 0;
	sg_PsmhReport.In = 0;
	sg_PsmhReport.Out = 0;
	sg_PsmhReport.Out = 0;
	sg_PsmfReport.In = 0;
	sg_PsmfReport.In = 0;
	sg_PsmfReport.Out = 0;
	sg_PsmfReport.Out = 0;
	bg_PsmfNew = 0;
	bg_PsmhNew = 0;
	
	gl_PrevLongi = 121.0 * 600000;
	gl_PrevLati = 31.0 * 600000;
	gc_GpsErrorCount = 0;
	gl_GpsError = 0;
	gl_GpsCorrect = 0;

 	
	bg_DispPeople = 1;              //初始化显示时间
	cg_GprsTxTimeCount = 0;
    //初始化定时器0
    TH0 = TIME0H;
    TL0 = TIME0L;
    TMOD = 0X21;          //T1 工作方式为8位自动重装载
  
    ET0 = 1;
    TR0 = 1;
    EA = 1;
   
    LedIni();
   
    for(cl_Buff=0; cl_Buff<8; cl_Buff++)
    {
    	cg_LedBuff[cl_Buff] = 8;
    }
    LedDisp(cg_LedBuff);
	
	if(!GPS_Y)
    {
    //    GPS Yes
		bg_GpsFirst = 0;
      	bg_Gps = 1;
       	cg_ExtInter |= GPS_ON;
       	EXT_INTER = cg_ExtInter;   //打开GPS
		//
#ifdef W77E58
			// sm0_1 sm1_1 sm2_1 ren_1
			SCON1 = 0x50;
			TH1 = 250;
			TL1 = 250;
			ET1 = 1;
			ES1 = 1;
			TR1 = 1;
#endif
	}
    else 
    {
    	//GPS no
    	bg_Gps = 0;
    }
    if(!GPRS_Y)
    {
    	//GPRS yes
    	sg_GprsSendQuene.Len = 0;
    	sg_GprsSendQuene.Position = 0;
    	cg_GprsRecDataBuff[0] = 0;
    	GprsSerialIni();
    	cl_Buff = GprsStartUp();          //启动GPRS,连接上网
		cg_GprsConnectTime = 0;           //gprs重新建链时间清0
		if(cl_Buff != 0)
		{
			//gprs启动失败
			bg_Gprs = 0;
			DispError(2);
			delay(10);
		}
		else
		{
			cg_ExtInter &= GPRS_RED_OFF;  //gprs工作正常
    	    EXT_INTER = cg_ExtInter;
			bg_Gprs = 1;
			bg_GprsRxData = 0;
		}
    }
    else
    {
    	//Gprs no
    	bg_Gprs = 0;
    }       
    while(1)
    {
    	//检测can,直到can工作正常
	  	cl_Buff = CanTest();
	    cl_Buff = CanIni();
	    cl_Buff = CAN_IER;
		i = 0;
		while((i<100) && (cl_Buff != CAN_IER_SET))
		{
			cl_Buff = CanIni();
			cl_Buff = CAN_IER;
			if(cl_Buff == CAN_IER_SET)
			{
				break;
			}
			i ++;
		}
	    if(cl_Buff != CAN_IER_SET)
	    {
	    	//can work erro,disp erro ID
	      	//DispError(CAN_ERR);
	      	sg_CanLed.RedOn   = 5;
	    	sg_CanLed.RedOff  = 0;
	    }
	    else
	    {
			
			
	    	//can 工作正常,初始化
	    	sg_CanLed.GreenOn = CAN_LED_NORMAL_ON;
	    	sg_CanLed.GreenOff = CAN_LED_NORMAL_OFF;
	    	sg_CanLed.RedOn   = 0;
	    	sg_CanLed.RedOff  = 0;
	    	sg_CanOver.Flag = CAN_OVER_TIME_INVALID;
	    	sg_CanOver.Count = 0;
	    	sg_CanSendQuene.Len = 0;
	    	sg_CanSendQuene.Position = 0;
			sg_Psmf.Flag = LABLE_INVALID;
			sg_Psmh.Flag = LABLE_INVALID;
			sg_Ccm.Flag = LABLE_INVALID;
			sg_Assm.Flag = LABLE_INVALID;
			bg_CanRst = 0;
			cg_CanErrCount = 0;
			cg_CanTxTime = 0;
			bg_PsmfNull = 1;
			bg_PsmhNull = 1;
			break;
	    }
	}
	SaveDeal(BROADCAST,0x00,&sg_CanSendQuene);
	// SendComm(GPRS_COLLECT_REPORT,&sg_GprsSendQuene);
	//完成初始化,进入主循环流程
	while(1)
	{
		
		cl_Buff = CAN_IR;
		if(cl_Buff != 0)
		{
			Extint0(cl_Buff);
			cl_Buff = CAN_STATUS;
			
		}
		cl_Buff = CAN_ECC;
		if(cl_Buff == 0)
		{
			sg_CanLed.RedOn = 0;
		}
		else
		{
			sg_CanLed.RedOn = 3;
			sg_CanLed.RedOff = 50;
		}
	
		if(!bg_CanSinger)                 //can系统是多节点,可以进行正常通信
		{
			if(cg_CanCheckTime > 59)      //每隔1分钟发一次查询帧
			{
				cg_CanCheckTime = 0;
				SaveDeal(BROADCAST,0x00,&sg_CanSendQuene);  //发送广播命令
			}
			if(cg_CanRequireTime > 10)  //每隔20秒发一次记录查询信息
			{
				cg_CanRequireTime = 0;
				if((!bg_DataTxGprs) && (bg_Gprs))
				{
					if(sg_Psmf.Flag == LABLE_VALID)
					{
						SaveDeal(Q_CAN_COLLECT_REPORT,sg_Psmf.Id,&sg_CanSendQuene);
					}
					if(sg_Psmh.Flag == LABLE_VALID)
					{
						SaveDeal(Q_CAN_COLLECT_REPORT,sg_Psmh.Id,&sg_CanSendQuene);
					}
				}
			}
			if(bg_CanRx)
			{
				//can接收到一帧数据,进行数据接收处理
				CanRxDeal();
				bg_CanRx = 0;
			}
			else if(sg_CanOver.Flag == CAN_OVER_TIME_VALID)
			{
				//can 超时有效,检测是否到超时
				if(sg_CanOver.Count > CAN_OVER_TIME)
				{
					//can 超时,超时处理
					sg_CanOver.Try ++;
					
					if(sg_CanOver.Try > 4)
					{
						cg_CanErrCount ++;
						if(cg_CanErrCount > 2)            //can 超时错误次数大于5,重新复位CAN
						{
							cg_CanErrCount = 0;
							cl_Buff = CanIni();
						}
						sg_CanOver.Flag = CAN_OVER_TIME_INVALID;
						sg_CanOver.Count = 0;
						sg_CanOver.Try = 0;
						bg_DataTxGprs = 0;                    //
					}
					else
					{
						sg_CanOver.Count = 0;
						CanTxDeal(cg_CanComId,cg_CanTarget);  //重发上次数据,输入参数(cg_CanComId,cg_CanTarget)
					}
				}
			}
			else if(sg_CanSendQuene.Len != 0)
			{
				//can 发送队列不为零,发送处理
				TakeOutDeal(&cg_CanComId,&cg_CanTarget,&sg_CanSendQuene);
				
				if(!bg_DataTxGprs)                                 
				{
					CanTxDeal(cg_CanComId,cg_CanTarget);	
				}
				else if(cg_CanComId != Q_CAN_COLLECT_REPORT)  //向gprs发送数据时,不再发送新的命令到psmf,psmh
				{
					CanTxDeal(cg_CanComId,cg_CanTarget);
				}
			}
		}
		else                            //can系统是单节点,不能进行通信,定时对can网络进行检测
		{
			if(cg_CanCheckTime > 1)     //间隔时间为 2S
			{
				cg_CanCheckTime = 0;
				SaveDeal(BROADCAST,0x00,&sg_CanSendQuene);  //发送广播命令
				bg_CanSinger = 0;
			}
		}
		
		if(cg_GprsTxTimeCount > 30)
		{
			cg_GprsTxTimeCount = 0;
			bg_DataTxGprs = 0;
		}
		
		if(!GPRS_Y)                            //gprs 发送处理
		{
			if(bg_Gprs)                        //gprs 建莲成功,可以进行正常的通讯
			{
				if(cg_GprsCheckTime > 120)
				{
					cg_GprsCheckTime = 0;
					if(!bg_DataTxGprs) 
					{
	//					SendComm(GPRS_CHECK,&sg_GprsSendQuene);
					}
				}
				if(cg_GprsGpsTxTime > 29)     //上报Gps信息
				{
					cg_GprsGpsTxTime = 0;
					if( (!bg_DataTxGprs) && (sg_GprsReport.GpsInfo.Flag != 'V') )
					{
						SendComm(GPRS_GPS_POSITION,&sg_GprsSendQuene);
					}
				}
				//gprs模块存在
				if(bg_GprsRxData)                         //gprs 收到一帧信息
				{
					GprsRxDeal();
					bg_GprsRxData = 0;
				}
				else if(bg_GprsOverFlag)                  //超时标志有效 
				{
					if(cg_GprsOverCount > GPRS_OVER_TIME) //检测是否超时
					{
						cg_GprsErrorCount ++;
					
						if(cg_GprsErrorCount > 9)
						{
							
							bg_GprsOverFlag = 0;          //清除超时标志,
							bg_Gprs = 0;                  //Gprs连续无响应,置标志位
							sg_GprsSendQuene.Len = 0;     //将gprs发送缓冲区清空
							cg_GprsErrorCount = 0;        //
							bg_DataTxGprs = 0;            //
							cg_GprsConnectTime = 2;       //
						}
						else
						{
							bg_GprsRepeat = 1;
							cg_GprsOverCount = 0;
							GprsTxDeal(cg_GprsComId);     //超时,重发
						}
					}
				}
				else if(sg_GprsSendQuene.Len != 0)        //检测gprs发送队列长度是否为零
				{
					cg_GprsErrorCount = 0;                //Gprs 发送错误计数清零
					TakeOutQuene(&cg_GprsComId, &sg_GprsSendQuene);
				
					if( !bg_DataTxGprs) 
					{
						if(cg_GprsComId == GPRS_COLLECT_REPORT)
						{
							bg_GprsRxFirst = 0;                   //发送一次新的记录,标志清零
						}
						GprsTxDeal(cg_GprsComId);
					}
					else if(cg_GprsComId == GPRS_COLLECT_REPORT)
					{
						bg_GprsRxFirst = 0; 
						GprsTxDeal(cg_GprsComId);
					}
				}
			}
			else                                       //gprs 不能正常建莲,定时进行重新建莲
			{
				if(cg_GprsConnectTime > 1)
				{
					cl_Buff = GprsRepeatConnect();     //Gprs重新建莲

⌨️ 快捷键说明

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