📄 gprs_program.c
字号:
/******************************************************/
/* 日期: */
/* 功能: */
/* 硬件: */
/* 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 + -