📄 gprs.c
字号:
}
/******************************************************************************/
/* 删除全部短消息 */
/******************************************************************************/
void delete_all_sms(void) //删除全部短消息
{
uchar index1,index2;
for(index1=0x31;index1<=0x39;index1++)
{
WDT_CONTR=0x3e; //喂狗
ES=0;
TI=1;
printf("AT+CMGD=%c\r",index1);
TI=0;
ES=1;
Wait_clear_inbuf();
}
for(index2=0x31;index2<0x35;index2++)
{
for(index1=0x30;index1<=0x39;index1++)
{
WDT_CONTR=0x3e; //喂狗
ES=0;
TI=1;
printf("AT+CMGD=%c%c\r",index2,index1);
TI=0;
ES=1;
Wait_clear_inbuf();
}
}
}
/**********************************************************************/
/* 创建一个服务层(客户端模式) */
/**********************************************************************/
void build_srvprofile(unsigned char srvprofileID,unsigned char *IP_remove)
{
do{
EA=0;
TI=1;
printf("AT^SISC=%c\r",srvprofileID); //先关闭此服务层,防止产生错误
delay(50000);
WDT_CONTR=0x3e; //喂狗
printf("AT^SISS=%c,\"srvType\",\"none\"\r",srvprofileID); //清空此服务层
delay(50000);
WDT_CONTR=0x3e; //喂狗
printf("AT^SISS=%c,\"srvType\",\"socket\"\r",srvprofileID); //service type
delay(50000);
WDT_CONTR=0x3e; //喂狗
printf("AT^SISS=%c,\"conId\",\"0\"\r",srvprofileID); //I.D.
delay(50000);
WDT_CONTR=0x3e; //喂狗
printf("AT^SISS=%c,\"address\",\"socktcp://%s\"\r",srvprofileID,IP_remove); //远端IP及port
delay(50000);
WDT_CONTR=0x3e; //喂狗
printf("AT^SISO=%c\r",srvprofileID); //open port to work
TI=0;
EA=1;
while(!Wait_RI) //等待接收完一帧数据
{
WDT_CONTR=0x3e;
}
Wait_RI=0;
do{
if(inbufsign)
i=getbyte();
else
break; //如果没有OK,跳出循环
}while(i!='K');
}while(i!='K');
clear_inbuf();
}
/******************************************************************/
/* 发送短信,告知自己的ip */
/******************************************************************/
void send_SMS(uchar *phone)
{
delay(60000); //发送短信前需等待一段时间,否则短消息发送不成功,具体原因未明。
WDT_CONTR=0x3e; //喂狗
EA=0;
TI=1;
printf("AT+CMGS=%s\r",phone); //发送短信,告知自己的IP地址
do
{
while(!RI); //等待接受手机模块返回'>'
j=SBUF;
RI=0;
}while(j!='>');
WDT_CONTR=0x3e; //喂狗
printf("%s",IP_self);
TI=0;
EA=1;
Wait_clear_inbuf();
}
/******************************************************************************/
/* 发送AT^SISW=Srvprofile,length */
/******************************************************************************/
void send_SISW(void)
{
uchar one,ten,hun,thou;
uint length;
EA=0;
TI=1;
length=inlast-inbuf;
*inlast='\0';
if(length>=1000)
{
one=length%10+0x30;
ten=(length/10)%10+0x30;
hun=(length/100)%10+0x30;
thou=length/1000+0x30;
printf("AT^SISW=%c,%c%c%c%c\r",SISW[0],thou,hun,ten,one);
}
else if(length>=100)
{
one=length%10+0x30;
ten=(length/10)%10+0x30;
hun=length/100+0x30;
printf("AT^SISW=%c,%c%c%c\r",SISW[0],hun,ten,one);
}
else if(length>=10)
{
one=length%10+0x30;
ten=length/10+0x30;
printf("AT^SISW=%c,%c%c\r",SISW[0],ten,one);
}
else
{
one=length+0x30;
printf("AT^SISW=%c,%c\r",SISW[0],one);
}
delay(60000);
WDT_CONTR=0x3e; //喂狗
printf("%S",inbuf);
TI=0;
EA=1;
clear_inbuf();
delay(60000);
delay(60000);
WDT_CONTR=0x3e; //喂狗
while(!Wait_RI) //等待接收完一帧数据
{
WDT_CONTR=0x3e;
}
Wait_RI=0;
do{
if(inbufsign)
i=getbyte();
else
break; //如果没有^,表示OK和^SISW不是一帧数据,跳出在大循环等待^SISW
}while(i!='W');
if(i=='W') //如果OK和^SISW是一帧数据,将服务层和原因信息装入数组
{
SISW[0]=*(getlast+2);
SISW[1]=*(getlast+5);
}
}
/*******************************************************************************/
// 关闭上次连接
/*******************************************************************************/
void close_conn(void)
{
WDT_CONTR=0x3e; //喂狗
ES=0;
TI=1;
printf("AT^SISC=%c\r",SISW[0]); //关闭服务层
delay(60000);
delay(60000);
printf("AT^SISS=%c,\"srvType\",\"none\"\r",SISW[0]);
//清空此服务层,以便以后重新分配
TI=0;
ES=1;
delay(60000);
delay(60000);
while(!Wait_RI) //等待接收数据
{
WDT_CONTR=0x3e;
}
Wait_RI=0;
}
/*******************************************************************************/
// 放入一个字节到发送缓冲区
/*******************************************************************************/
void putbyte(uchar c)
{
ES=0; /*暂停串行中断,以免数据比较时出错? */
while ( (((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-outlast)==2)))
{ ES=1;
c++;
c--;
ES=0;
}
WDT_CONTR=0x3e; //喂狗
*putlast=c; //放字节进入缓冲区
putlast++; //发送缓冲区指针加一
if (putlast==outbuf+OLEN)
putlast=outbuf; //指针到了顶部换到底部
outbufsign=1;
if (!outbufsign0)
{
outbufsign0=1;
TI=1;
} //缓冲区开始为空置为有,启动发送
ES=1;
}
/**********************************************************************************/
// 发送一个定义在程序存储区的字符串到串口
/**********************************************************************************/
void send_str(uchar *puts)
{
for (;*puts!='\0';puts++) //遇到停止符\0结束
putbyte(*puts);
}
/**********************************************************************************/
// 从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
// ->inbufsign 接收缓冲区非空标志 有=1
/**********************************************************************************/
uchar getbyte (void)
{
uchar idata c ;
while(!inbufsign) //缓冲区空等待
{
WDT_CONTR=0x3e;
}
ES=0;
c= *getlast; //取数据
getlast++; //最后取走的数据位置加一
inbufful=0; //输入缓冲区的满标志清零
if (getlast==inbuf+ILEN)
getlast=inbuf; //地址到顶部回到底部
if (getlast==inlast)
inbufsign=0; //地址相等置接收缓冲区空标志,再取数前要检该标志
ES=1;
return (c); //取回数据
}
/******************************************************************************/
// 等待接收完一帧数据并清空接收缓冲区
/******************************************************************************/
void Wait_clear_inbuf(void)
{
while(!Wait_RI) //缓冲区空等待
{
WDT_CONTR=0x3e;
}
Wait_RI=0;
inlast=inbuf;
getlast=inbuf;
inbufsign=0;
inbufful=0;
delay(30000);
Wait_RI=0;
}
/*****************************************************************************/
// 只清空接收缓冲区
/*****************************************************************************/
void clear_inbuf(void)
{
inlast=inbuf;
getlast=inbuf;
inbufsign=0;
inbufful=0;
Wait_RI=0;
WDT_CONTR=0x3e; //喂狗
}
/*****************************************************************************/
// 串口中断处理
/*****************************************************************************/
void serial (void) interrupt 4 using 2
{
if (TI)
{ TI = 0;
if (outbufsign)
{
SBUF=*outlast; //未发送完继续发送
outlast++; //最后传出去的字节位置加1
if(outlast==outbuf+OLEN)
outlast=outbuf; //若发送完整个缓冲区,地址到顶部回到底部
if (putlast==outlast)
outbufsign=0; //若发送完毕,数据发送完置发送缓冲区空标志
}
else
outbufsign0=0;
}
if (RI)
{ RI = 0;
if(!inbufful)
{
*inlast= SBUF; //放入数据到inbuf中
inlast++; //最后放入的位置加1
inbufsign=1;
if (inlast==inbuf+ILEN) //接收缓冲区满
inlast=inbuf; //地址到顶部回到底部
if (inlast==getlast)
inbufful=1; //接收缓冲区满置满标志
TH0=0xf5; // 启用帧接收完成检测功能,大于延时两个字节传输时间
TL0=0x33; //9600bps时,两个字节传输时间大约是2ms。
//de18--9.4ms;f533--3ms; f199--4ms.
//57600bps时,两个字节的传输时间大约是0.36ms。初值为FEB4.
//0.5ms--fe33;0.72ms--fd68
TR0=1; //启动定时器0
}
}
}
/******************************************************************************/
/* Time0: 定时器0的定时时间到 ,一帧接收结束 */
/******************************************************************************/
timer0() interrupt 1 using 0
{
Wait_RI=1; //延时时间到
}
/******************************************************************************/
/* 外部中断1 */
/******************************************************************************/
int1() interrupt 2 using 1
{
conn_485(); //模拟开关连接到485总线 PC
int1_RI=1;
ES=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -