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

📄 gprs_program.c

📁 simcom100 GPRS 模块源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************/
/*	日期:                                            */
/*	功能:                                            */
/*	硬件:                                            */
/*	IO口:                                            */
/******************************************************/

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

sbit GprsRst = P1^0;
/*
*********************************************************************************************
*
*	全局变量定义
*
*********************************************************************************************
*/
xdata char cg_IpAddr[]={"202.101.42.82"};
xdata char cg_Port[] = {"2020"};


bit bg_GprsRxComm;
bit bg_GprsRecSE;					//star receive 
bit bg_GprsRec; 
bit bg_GprsCr;						//receive <CR> data flag
bit bg_GprsTraFinish;				//finish transmiting data to gprs flag 
bit bg_GprsRxData;                  //Gprs receive a whole data frame
bit bg_GprsOverFlag;                //gprs超时处理标志
bit bg_Decode = 0;
bit bg_SendData = 0;
bit bg_GprsRst;
bit bg_GprsRedFlash;                //gprs 红灯闪烁标志
bit bg_GprsRxByteOver = 0;          //gprs 接收单字节超时标志
bit bg_GprsRxFirst = 0;             //接收到gprs第一次回复标志
bit bg_GprsRxSms;                   //接收到短信信息标志
bit bg_GprsRxHead;
bit bg_GprsRxSms;                   //gprs 收到一个短信信息
bit bg_GprsDataHead;                //
uchar xdata cg_GprsTxSerial;        //gprs 发送序列号
uchar xdata cg_Decode;
uchar xdata cg_GprsRxByteCount;     //gprs 接收单字节超时计数
uchar xdata cg_GprsOverCount;       //gprs超时计数器
uchar xdata cg_GprsRecBuff[GPRS_REC_COMM_SIZE];
uchar xdata cg_GprsTraBuff[GPRS_SEND_SIZE];
uchar xdata cg_GprsTx[GPRS_SEND_SIZE];
uchar xdata cg_GprsRecDataBuff[GPRS_REC_DATA_SIZE];
uchar xdata cg_GprsTraCount; 


S_GPRS_COLLECT_REPORT xdata sg_GprsReport;
S_GPRS_COLLECT_REPORT xdata sg_GprsCollectReport; 
S_SAVE_QUENE  xdata sg_GprsSendQuene;
    
/*
*********************************************************************************************
*
*	外部变量声明
*
*********************************************************************************************
*/
extern uchar xdata TimeCount;
extern uchar xdata cg_GprsErrorCount;
extern S_SYS_ID xdata sg_Psmf;                //PSMF ID
extern S_SYS_ID xdata sg_Psmh;                //PSMH ID
extern S_SEND_QUENE xdata sg_CanSendQuene;
extern bit bg_CanNull;  
extern bit bg_DispPeople;
extern uchar xdata cg_ExtInter;  
extern bit bg_Gprs;                      //
extern bit bg_PsmfNull;
extern bit bg_PsmhNull;
extern bit bg_DataTxGprs;
extern uchar xdata cg_DoorKind;
extern bit bg_GprsRepeat;                //gprs 重发标志
extern uchar xdata cg_GprsComId;          //gprs发送命令ID号
extern bit bg_DataTxGprs;
extern uchar xdata cg_GprsTxTimeCount;    //

/*rn 
*********************************************************************************************
*
*	代码段常量定义
*
*********************************************************************************************
*/
//define at command
	code uchar ATD[]= {"ATD"};
	code uchar CIPSTART[]={"AT+CIPSTART="}; 	//CONNECT TO SERIVERS
	code uchar CIPSEND[]={"AT+CIPSEND"};         //SEND DATA 
	code uchar CSTT[]={"AT+CSTT=CMNET,,"};
	code uchar CIICR[]={"AT+CIICR"};
	code uchar CIFSR[]={"AT+CIFSR"};
//	code uchar STATUS[]={"AT+CIPSTATUS"};
	code uchar ATI[] = {"ATI"};
	code uchar ATE[] = {"ATE0"};
	code uchar IPR[] = {"AT+IPR=115200"};
	code uchar CSQ[] = {"AT+CSQ"};
//respond message
	code uchar OK[]={"OK"};
//connet to serivers 
// CIPSTART
	code uchar CIPSTART_OK[] = {"CONNECT OK"};
	code uchar CIPSEND_OK[]  = {"SEND OK"};
	code uchar NO_CONNECT[]  = {"NO CONNECT"};
	code uchar ALREADY[]     = {"ALREADY CONNECT"};
	code uchar ERROR[]       = {"ERROR"};
	code uchar IP0[] = {"0.0.0.0"};
/*
********************************************************************************************
*
*	引用外部函数
*
********************************************************************************************
*/
extern uchar CodeRam(uchar code *CodeAddr,uchar *RamAddr);
extern uchar RamCodeCmp(uchar *RamAddr, uchar code *CodeAddr);
extern void delay(uchar i);
extern void SendComm(uchar ComId, S_SAVE_QUENE *pSaveQuene);
extern void SaveDeal( uchar ComId,uchar Target, S_SEND_QUENE *pSave);
extern void CanTxDeal(uchar ComId,uchar Target);
extern uchar VerifyCheck(uchar *DataQuene);
/*
*********************************************************************************************
*
*	本地函数声明
*
*********************************************************************************************
*/
uchar GprsConnect(uchar *IpAddr, uchar *Port);
uchar GprsSendData(uchar *DataAddr);
uchar GprsEcho(void);
void  GprsSerialIni();
uchar GprsStartUp();

void VerifyDeal(uchar *DataQuene);
void GprsRxDeal(void);
void GprsReport(S_GPRS_TX *pGprsTx);
void GprsCheck(S_GPRS_TX *pGprsTx);
void GprsTxDeal(ComId);
void Q_GprsCollectDataR(S_GPRS_TX *pGprsTx);
void GpsPosition(S_GPRS_TX *pGprsTx);
/*
**********************************************************************
*  函数功能:    打电话
                                                                     
*  输入参数:	 *TelNumber
				 电话号码指针,数字为assii码,以0x00为结束符                       
*  输出参数:    返回值 == 0x00 ,连接已oK
				        == 0x55 ,未连上                                                   
**********************************************************************	
*/
#if(0)
uchar GprsTel(uchar *TelNumber)
{
	uchar cl_Match;
	//uchar err;
	//void     *GprsRecMsg;
	//copy command to transmit buff
	cg_GprsTraBuff[0] = CodeRam(ATD,&cg_GprsTraBuff[1]);
	
	//copy TelNumber to transmit buff
	while(*TelNumber != 0x00)
	{
		cg_GprsTraBuff[0] ++;
		cg_GprsTraBuff[cg_GprsTraBuff[0]] = *TelNumber;	
		TelNumber ++;
	}
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = ';';	
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 0x0d;
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 0x0a;
	//star call tel
	TI0 = 0;
	SBUF0 = cg_GprsTraBuff[1];
	cg_GprsTraCount = 1;
	bg_GprsTraFinish = 1;
	bg_GprsRec = 0;
	while(bg_GprsTraFinish);
//	GprsRecMsg = OSMboxPend(GprsRec,0,&err);
//	if(err == OS_NO_ERR)
//	{
	while(!bg_GprsRec);
	bg_GprsRec = 0;
	
	//result commpare ,confirm if connet success
	cl_Match = RamCodeCmp(&cg_GprsRecBuff[1],OK);
	if(cl_Match == 0)
	{
		return 0x00;       //connet success
	}
	else
	{
		return 0x55;		//connet fail
	}

//	}
}
#endif
/*
**********************************************************************
*  函数功能:    connet to serivers
                                                                     
*  输入参数:	 *IpAddr   serivers ip addr
				 Port                         
*  输出参数:    返回值 == 0x00 ,连接已oK
				        == 0x55 ,未连上                                                   
**********************************************************************	
*/	
uchar GprsConnect(uchar *IpAddr, uchar *Port)
{
	uchar cl_Match;

	//copy command to transmit buff			
	cg_GprsTraBuff[0] = CodeRam( CIPSTART,&cg_GprsTraBuff[1]);
	
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = '"';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 'U';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 'D';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 'P';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = '"';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = ',';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = '"';
	//copy IpAddr to transmit buff
	while((*IpAddr) != 0x00)
	{
		cg_GprsTraBuff[0] ++;
		cg_GprsTraBuff[cg_GprsTraBuff[0]] = *IpAddr;	
		IpAddr ++;
	}
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = '"';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = ',';
	
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = '"';
	//copy port to transmit buff
	while(*Port != 0x00)
	{
		cg_GprsTraBuff[0] ++;
		cg_GprsTraBuff[cg_GprsTraBuff[0]] = *Port;	
		Port ++;
	}
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = '"';
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 0x0d;
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 0x0a;
	
	//star connect 
	TI = 0;
	SBUF = cg_GprsTraBuff[1];
	cg_GprsTraCount = 1;
	bg_GprsTraFinish = 1;
	bg_GprsRec = 0;
	bg_GprsRxComm = 1;
	while(bg_GprsTraFinish);
    //check ok?
	TimeCount = 0;         //请时间计数器
	while(!bg_GprsRec)
	{
		if(TimeCount > 200)
		{
			bg_GprsRxComm = 0;
			return 0x55;  //接收失败
		}
	}
	bg_GprsRec = 0;        //收到一帧命令回复信息,清接收标志
	
	cl_Match = RamCodeCmp(&cg_GprsRecBuff[1],&OK[0]);
	if(cl_Match == 0) 
	{
		//check connect ok?
		TimeCount = 0;         //请时间计数器
		while(!bg_GprsRec)
		{
			if(TimeCount > 200)
			{
				bg_GprsRxComm = 0;
				return 0x55;  //接收失败
			}
		}
		bg_GprsRec = 0;        //收到一帧命令回复信息,清接收标志
		cl_Match = RamCodeCmp(&cg_GprsRecBuff[1],&CIPSTART_OK[0]);
		
		if( cl_Match == 0)
		{
			bg_GprsRxComm = 0;
			return 0x00;       //connet success
		}
		else
		{
			bg_GprsRxComm = 0;
			return 0x55;	   //connet fail
		}
	}
	else
	{
		cl_Match = RamCodeCmp(&cg_GprsRecBuff[1],&ALREADY[0]);
		if( cl_Match == 0)
		{
			TimeCount = 0;         //请时间计数器
		    while(!bg_GprsRec)
		    {
			    if(TimeCount > 200)
			    {
			    	bg_GprsRxComm = 0;
				    return 0x55;  //接收失败
			    }
		    }
		    bg_GprsRec = 0;        //收到一帧命令回复信息,清接收标志	
		    bg_GprsRxComm = 0;
		    return 0;	
		}
		else
		{
			cl_Match = RamCodeCmp(&cg_GprsRecBuff[1],&ALREADY[0]);
			if(cl_Match == 0)
			{
				TimeCount = 0;         //请时间计数器
				while(TimeCount < 200);
			}
			else
			{
					
				TimeCount = 0;         //请时间计数器
				while(TimeCount < 10);
			}
			bg_GprsRxComm = 0;
			return 0x55;
		}
	}

}

/*
**********************************************************************
*  函数功能:    SEND DATA FROM GPRS
                                                                     
*  输入参数:	 *DataAddr   
				 sending data of the firist addr 
				 ending symbol = 0x00                         
*  输出参数:    返回值 == 0x00 ,send success
				        == 0x55 ,send fail  
				        == 0x50 ,  connect fail,send fail                                                 
**********************************************************************	
*/	
uchar GprsSendData(uchar *DataAddr)
{
	uchar cl_Match;
	uchar i;

	//copy command to transmit buff			
	cg_GprsTraBuff[0] = CodeRam( CIPSEND,&cg_GprsTraBuff[1]);

	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 0x0d;
	cg_GprsTraBuff[0] ++;
	cg_GprsTraBuff[cg_GprsTraBuff[0]] = 0x0a;
	
	//star connet 
	TI = 0;
	SBUF = cg_GprsTraBuff[1];
	cg_GprsTraCount = 1;
	bg_GprsTraFinish = 1;
	bg_GprsRec = 0;
	bg_GprsRxComm = 1;
	while(bg_GprsTraFinish);

	TimeCount = 0;         //请时间计数器
	while(!bg_GprsRec)
	{
		if(TimeCount > 200)
		{
			bg_GprsRxComm = 0;
			return 0x55;  //接收失败
		}
	}
	bg_GprsRec = 0;        //收到一帧命令回复信息,清接收标志

	if(cg_GprsRecBuff[1] == '>')
	{
		//ready send data 
		cg_GprsTraBuff[0] = 0;
		
		for(i=0; i<DataAddr[0]; i++)
		{
			cg_GprsTraBuff[0] ++;
			cg_GprsTraBuff[cg_GprsTraBuff[0]] = DataAddr[i];
		}
		//if(DataAddr[0] != 5)
		//{
		//	return 11;
		//}
		cg_GprsTraBuff[0] ++;
		cg_GprsTraBuff[cg_GprsTraBuff[0]] = Ctrl_Z;
		
		TI = 0;
		SBUF = cg_GprsTraBuff[1];
		cg_GprsTraCount = 1;
		bg_GprsTraFinish = 1;
		bg_GprsRec = 0;
		bg_GprsRxComm = 1;

		//清空接收缓冲区
		cg_GprsRecDataBuff[0] = 0;       /////////////////////////////
		bg_SendData = 1;
		while(bg_GprsTraFinish);
		bg_SendData = 0;
	}
	else
	{
		TimeCount = 0;         //请时间计数器
		while(TimeCount < 20);
		bg_GprsRxComm = 0;
		return 0x55;
	}
	
	TimeCount = 0;         //请时间计数器
	while(!bg_GprsRec)
	{
		if(TimeCount > 200)
		{
			bg_GprsRxComm = 0;

⌨️ 快捷键说明

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