📄 gprs.c
字号:
#include "gprs.h"
#define GPRSPWON P16 = 1;delay_10ms(100);P16 = 0;delay_10ms(4);P16 = 1;
#define STIMER 200
#define MTIMER 2000
#define LTIMER 5000
//gprs信息
xdata struct {
uchar hip[16]; //ip地址
uchar hpt[8]; //端口
uchar phnum[3][16]; //电话
} GprsInf;
xdata uchar InPhNum[16]; //呼入电话
bit RingFlag; //话铃
bit TelFlag = 0; //通话
bit BusyFlag = 0;
static bit ErFlag = 0; //错误标志
static bit OkFlag = 0; //正确标志
static bit NOFlag = 0; //无载波
static bit NSIGFlag = 0; //无信号
static bit HoldFlag = 0; //挂断
static bit IdFlag = 0; //电话识别码
uchar xdata AtRcvBuf[DATABUFSIZE]; //接收缓冲
uint AtRcvBufLen = 0; //缓冲长度
/*************************************************
at命令接收处理
*************************************************/
void AtRcvPro(uchar *p, uint len) {
uint i = 0;
uchar flag = 0;
TrDataSendProc(p, len);
if(!strcmp(p, "OK")) {
OkFlag = 1;
// LED1 = !LED1;
}
else if(!strcmp(p, "ERROR")) {
ErFlag = 1;
// P42 = !P42;
} //tcp链接打开正确
else if(!strcmp(p, "RING")) {
RingFlag = 1;
TelFlag = 1;
// LED1 = !LED1;
}
else if(!strcmp(p, "NO CARRIER")) {
HoldFlag = 1;
// LED1 = !LED1;
}
else if(!strcmp(p, "CONNECT")) {
OkFlag = 1;
// LED1 = !LED1;
}
else if(!strncmp(p, "+CLIP", 5)) {
IdFlag = 1;
i = 0;
while(*p != '\0') {
if(*p == '"')
flag++;
if((flag == 1) && (*p != '"')){
InPhNum[i] = *p; //存储来电号码
i++;
}
if(flag == 2)
break;
p++;
}
InPhNum[i] = '\0';
}
}
/*************************************************
at命令发送处理
*************************************************/
uchar AtSendPro(uchar *p, uint t) {
uint len = strlen(p);
uint len1;
SetCounter(&ErrCounter, 10); //设置错误计数器
delay_10ms(50);
while(1) {
while(len1 = ReadVkBuf0(AtRcvBuf)) { //读取缓冲区长度有效
AtRcvPro(AtRcvBuf, len1); //处理at命令字符串
delay_10ms(30);
}
if(OkFlag) {
OkFlag = 0;
ClrCounter(&ErrCounter);
return 1;
}
if(ErFlag) {
ErFlag = 0;
if(Counter(&ErrCounter))
return 0; //出错次数满,返回
VkSend(p, len, GPRSPORT);
delay_10ms(50);
}
WDT;
}
return 0;
}
/*************************************************
取消回显
*************************************************/
void SetEcho(void) {
uchar code p[] = "ATE0\r";
AtSendPro(p, STIMER);
}
void SetPhone(void) {
uchar code p[] = "AT+CLIP=1\r";
AtSendPro(p, STIMER);
}
/*************************************************
设置波特率
*************************************************/
void SetGprsBoud(void) {
uchar code p[] = "AT+IPR=9600\r";
AtSendPro(p, STIMER);
}
/*************************************************
设置串口
*************************************************/
void SetGprsUart(void) {
uchar code p[] = "AT+ICF=3,3\r";
AtSendPro(p, STIMER);
}
/*************************************************
设置接入网关
*************************************************/
void SetDcont(void) {
uchar code p[] = "AT+CGDCONT=1,\"IP\",\"CMNET\"\r";//设置接入网关cmnet;
AtSendPro(p, STIMER);
}
/*************************************************
设置isp
*************************************************/
void SetIsp(void) {
uchar code p[] = "AT$APNSRV=\"CMNET\"\r";
AtSendPro(p, STIMER);
}
/*************************************************
设置远端ip
*************************************************/
void SetHip(void) {
uchar xdata p[64] = "AT$TCPSRV=0,\"";
strcat(p, GprsInf.hip);
strcat(p, "\"\r");
AtSendPro(p, STIMER);
}
/*************************************************
设置远程端口port
*************************************************/
void SetHpt(void) {
uchar xdata p[64] = "AT$TCPPORT=";
strcat(p, GprsInf.hpt);
strcat(p, "\r");
AtSendPro(p, STIMER);
}
/*************************************************
连接gprs
*************************************************/
void ConnStart(void) {
uchar code p[] = "AT$CONNSTART\r";
AtSendPro(p, MTIMER);
}
/*************************************************
关闭gprs
*************************************************/
void ConnStop(void) {
uchar *p;
p = "AT$CONNSTOP\r";
AtSendPro(p, MTIMER);
}
/*************************************************
建立tcp连接
************************************************/
uchar TcpOpen(void) {
uchar code p[] = "AT$TCPOPEN\r";
if(AtSendPro(p, MTIMER)) {
ModeFlag = DATAMODE; //数据模式
return 1;
}
return 0;
}
/********************************************
关闭tcp链接
********************************************/
void TcpClose(void) {
uchar code p[] = "\x03";
ModeFlag = CMDMODE;
AtSendPro(p, MTIMER);
}
/********************************************
话筒偏置电压
********************************************/
void SetMicb(void) {
uchar code p[] = "AT+MICB=1\r";
AtSendPro(p, MTIMER);
}
/********************************************
设置话筒音量
********************************************/
void SetAtxg(void) {
uchar code p[] = "AT+ATXG=24\r";
AtSendPro(p, MTIMER);
}
/********************************************
设置听筒音量
********************************************/
void SetArxv(void) {
uchar code p[] = "AT+ARXV=5\r";
AtSendPro(p, MTIMER);
}
/********************************************
忙音
********************************************/
void SetIctone(uchar n) {
xdata uchar p[64] = "AT+ICTONE=";
switch(n) {
case 0: strcat(p, "0"); break;
case 1: strcat(p, "1,1350,0,10,10"); break;
case 2: strcat(p, "1,450,0,35,35"); break;
default : break;
}
strcat(p, "\r");
AtSendPro(p, MTIMER);
}
/*************************************************
初始化gprs模块
*************************************************/
void InitGprs(void) {
GPRSPWON //上电
delay_10ms(1000);
EnVkS(GPRSPORT);
ClrBuf(0);
delay_10ms(2000);
LED1 = !LED1;
strcpy(GprsInf.hip, "210.51.191.99");
strcpy(GprsInf.hpt, "4097");
strcpy(GprsInf.phnum[0], "0");
strcpy(GprsInf.phnum[1], "0");
strcpy(GprsInf.phnum[2], "0");
strcpy(GprsInf.phnum[0], "01062119750");
SetGprsBoud();
delay_10ms(200);
SetVkBoud(0, 1);
delay_10ms(1000);
SetPhone();
delay_10ms(200);
SetArxv();
delay_10ms(200);
SetAtxg();
delay_10ms(200);
SetMicb();
delay_10ms(200);
while(Csq() == 0);
delay_10ms(200);
SetDcont();
delay_10ms(200);
SetIsp();
delay_10ms(200);
SetHip();
delay_10ms(200);
SetHpt();
delay_10ms(200);
ConnStart();
delay_10ms(200);
}
/*************************************************
在线模式
*************************************************/
void Online(void) {
uchar code p[] = "ATO\r";
AtSendPro(p, MTIMER);
ModeFlag = DATAMODE; //进入数据模式,不接收响应字符串
}
/*************************************************
离线模式
*************************************************/
void Offline(void) {
uchar code p[] = "+++";
ModeFlag = CMDMODE; //进入命令模式,接收响应字符
AtSendPro(p, MTIMER);
delay_10ms(STIMER);
}
/************************************************
保存
************************************************/
void SaveGprs(void) {
uchar code p[] = "AT$W\r";
AtSendPro(p, MTIMER);
}
/********************************************
呼叫号码检查,相同返回1
********************************************/
uchar CmpPhNum(void) {
uchar i;
for(i = 0; i < 3; i++) {
if(!strcmp(GprsInf.phnum[i], InPhNum))
return 1;
}
return 0;
}
void AnswerTel(void) {
uchar code p[] = "ATA\r";
NetState = 0;
AtSendPro(p, MTIMER);
}
void HoldTel(void) {
uchar code p[] = "ATH\r";
AtSendPro(p, MTIMER);
TelFlag = 0;
}
void NoCarrier(void) {
NetState = 1;
TelFlag = 0;
}
/********************************************
AT命令返回处理
********************************************/
void AtPro(void) {
uint len;
while(len = ReadVkBuf0(AtRcvBuf)) {
AtRcvPro(AtRcvBuf, len);
delay_10ms(30);
}
if(RingFlag) { //话铃标志
RingFlag = 0;
if(IdFlag) {
IdFlag = 0;
if(CmpPhNum() && !GrSendBusy) {
SetIctone(1);
delay_10ms(1000);
SetIctone(0);
AnswerTel();
}
else
HoldTel();
}
}
if(HoldFlag) { //忙音标志
HoldFlag = 0;
SetIctone(2);
delay_10ms(1000);
SetIctone(0);
NoCarrier();
}
if(RingInt) { //话铃中断
RingInt = 0;
StopTimer(&TmoTimer);
Offline();
HoldTel();
Online();
StartTimer(&TmoTimer);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -