📄 gprs.c
字号:
delay(4000);
conn_module(); //模拟开关连接到模块
}
if(inbuf[12]=='2') //表示数据已经接收完毕
{
inbuf[2]=0;
conn_485(); //模拟开关连接到485总线
send_str("All data have been written!\r\n\0");
delay(4000);
conn_module(); //模拟开关连接到模块
}
}
break;
default: //数据流
if((SISW[1]=='1')&&(int1_RI==1))
{
int1_RI=0;
WDT_CONTR=0x3e; //喂狗
send_SISW();
conn_485(); //模拟开关连接到485总线
send_str("Data have been sent!\r\n\0");
delay(4000);
conn_module(); //模拟开关连接到模块
}
break;
} //switch语句结束
} //while函数结束
} //主函数结束
/*******************************************************************************/
/*****************************函数定义******************************************/
/*******************************************************************************/
/******************************************************************************/
/* 延时t毫秒 */
/******************************************************************************/
void delay(uint time)
{
uint t;
for(t=0;t<time;t++)
{;}
}
/******************************************************************************/
/* 串行口和定时器0初始化 */
/******************************************************************************/
void serl_init(void)
{
/***********************************************************************
波特率 晶振/MHZ SMOD 定时器1模式 定时器初值
57600 11.0592 1 2 FFH
19200 11.0592 1 2 FDH
9600 11.0592 0 2 FDH
4800 11.0592 0 2 FAH
2400 11.0592 0 2 F4H
1200 11.0592 0 2 E8H
************************************************************************/
TMOD=0x21; //定时器1八位自动重装,定时器0十六位
TL1=0xFD;
TH1=0xFD;
SCON=0x50; //串口工作于方式1,10位异步,定时器控制
//PCON=0x80; //外晶振11.0592MHz,19200波特
TR1=1; //开定时器1
ES=1; // 使能串行中断
ET0=1; // 使能定时器0中断
EX1=1; //使能外部中断1
ET2=1; // 使能定时器2中断
EA=1; // 使能总中断
WDT_CONTR=0x3e; //启动看门狗,溢出时间为4.55s。
//喂狗,不要用WDT_CONTR=WDT_CONTR|0x10
//溢出时间=(时钟模式*预分频值*32768)/晶振频率
/**************************************************************************
寄存器 7 6 5 4 3 2 1 0 复位值
WDT_CONTR - - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx000000
看门狗定时器 使能狗 清空狗 空闲计数 预分频器
**************************************************************************/
}
/******************************************************************************/
/* 启动模块 */
/******************************************************************************/
void IGT_target(void)
{
P1_4=0; //使IGT信号为高电平
delay(60000); //延时---time=10000时,大约延时60ms
P1_4=1; //P1.4为高电平,IGT为低电平,启动模块
delay(60000); //IGT拉低>100ms
P1_4=0; //IGT高阻
}
/******************************************************************************/
/* 连接到模块 */
/******************************************************************************/
void conn_module(void)
{
P1_0=0;
P1_1=1;
EX1=1;
}
/******************************************************************************/
/* 连接到485总线 */
/******************************************************************************/
void conn_485(void)
{
P1_0=1;
P1_1=0;
EX1=0;
}
/******************************************************************************/
/* 模块初始化 */
/******************************************************************************/
void module_init(void)
{
send_str("ATE0\r\0"); //设置是否回显AT指令
Wait_clear_inbuf(); //等待接收完一帧数据并清空接收缓冲区
send_str("AT+IPR=9600\r\0"); //设置固定波特率
Wait_clear_inbuf(); //等待接收完一帧数据并清空接收缓冲区
send_str("AT+CMEE=2\r\0"); //显示错误返回码为文本信息
Wait_clear_inbuf(); //等待接收完一帧数据并清空接收缓冲区
send_str("AT^SSYNC=1\r\0"); // 把SYNC同步信号设置为LED指示模式
Wait_clear_inbuf(); //等待接收完一帧数据并清空接收缓冲区
}
/******************************************************************************/
/* GPRS通信链路初始化函数 */
/******************************************************************************/
void TCP_set()
{
do{
WDT_CONTR=0x3e; //喂狗
delay(60000);
send_str("AT^SISC=0\r\0"); //关闭所有服务层
Wait_clear_inbuf();
send_str("AT^SISC=1\r\0");
Wait_clear_inbuf();
send_str("AT^SISC=2\r\0");
Wait_clear_inbuf();
send_str("AT^SISC=3\r\0");
Wait_clear_inbuf();
send_str("AT^SISC=4\r\0");
Wait_clear_inbuf();
send_str("AT^SISC=5\r\0");
Wait_clear_inbuf();
send_str("AT^SISS=0,\"srvType\",\"none\"\r\0"); //清空所有服务层
Wait_clear_inbuf();
send_str("AT^SISS=1,\"srvType\",\"none\"\r\0");
Wait_clear_inbuf();
send_str("AT^SISS=2,\"srvType\",\"none\"\r\0");
Wait_clear_inbuf();
send_str("AT^SISS=3,\"srvType\",\"none\"\r\0");
Wait_clear_inbuf();
send_str("AT^SISS=4,\"srvType\",\"none\"\r\0");
Wait_clear_inbuf();
send_str("AT^SISS=5,\"srvType\",\"none\"\r\0");
Wait_clear_inbuf();
//*AT^SICS用于创建和编辑一个网络连接层,一个连接层可以分配一个或更多的服务层
send_str("AT^SICS=0,\"conType\",\"GPRS0\"\r\0"); //set GPRS mode
Wait_clear_inbuf();
send_str("AT^SICS=0,\"user\",\"\"\r\0"); //user name
Wait_clear_inbuf();
send_str("AT^SICS=0,\"passwd\",\"\"\r\0"); //password
Wait_clear_inbuf();
send_str("AT^SICS=0,\"apn\",\"cmnet\"\r\0"); //network operater
Wait_clear_inbuf();
//AT^SISS用于创建一个服务层(服务器侦听模式)
send_str("AT^SISS=0,\"srvType\",\"socket\"\r\0"); //service type
Wait_clear_inbuf();
send_str("AT^SISS=0,\"conId\",\"0\"\r\0"); //I.D.
Wait_clear_inbuf();
send_str("AT^SISS=0,\"address\",\"socktcp://listener:20000\"\r\0");
Wait_clear_inbuf(); //socket, TCP mode, port 20000
// delay(60000);
// WDT_CONTR=0x3e; //喂狗
clear_inbuf();
//若返回数据不是OK,则一直重发此指令
send_str("AT^SISO=0\r\0"); //open the port, start service
clear_inbuf();
delay(60000);
WDT_CONTR=0x3e; //喂狗
delay(60000);
WDT_CONTR=0x3e;
while(!Wait_RI) //等待接收数据
{
WDT_CONTR=0x3e;
}
Wait_RI=0;
do{
WDT_CONTR=0x3e;
if(inbufsign)
{
i=getbyte();
}
else
break;
}while(i!='K');
}while(inbufsign==0);
/*****************获取Ip地址**********************************/
WDT_CONTR=0x3e; //喂狗
delay(60000);
delay(60000);
WDT_CONTR=0x3e; //喂狗
EA=0;
TI=1;
printf("AT^SISO?\r"); //不用中断
TI=0;
do{
do
{
while(!RI); //等待接收数据
j=SBUF;
RI=0;
}while(j!='0'); //服务层0后面应该是一个逗号
while(!RI); //等待接收数据
j=SBUF;
RI=0;
}while(j!=',');
for(n=0;n<11;n++) //第11个"后是IP地址和端口号
{
do
{
while(!RI); //等待接收数据
j=SBUF;
RI=0;
}while(j!='\"');
}
i=1;
do
{
while(!RI); //等待接收数据
j=SBUF;
IP_self_buf[i++]=j;
RI=0;
}while(j!='\"'); //"为IP地址终止位
i=i-1;
IP_self_buf[i++]='!'; //IP以!结尾
IP_self_buf[i++]='\x1a';
IP_self_buf[i++]='\r';
IP_self_buf[i]='\0';
IP_self_buf[0]='%'; //IP以%开头
IP_self=IP_self_buf; //IP_self指针指向自己的ip地址
EA=1;
}
/******************************************************************************/
/* 短消息参数初始化 */
/******************************************************************************/
void SMS_set()
{
send_str("AT+CMGF=1\r\0"); //设置短消息格式为text格式
Wait_clear_inbuf();
send_str("AT^SSDA=1\r\0"); //允许显示短消息
Wait_clear_inbuf();
send_str("AT+CSMS=1\r\0"); // 设为Phase2+版本
Wait_clear_inbuf();
send_str("AT^SSMSS=0\r\0"); //MT的存储顺序为先ME后SM
Wait_clear_inbuf();
send_str("AT^SM20=1,0\r\0"); //设置发送短消息模式,如果未发送成功,返回ERROR。
Wait_clear_inbuf();
send_str("AT^SMGO=1\r\0"); //使能查询短信存储区是否已满
Wait_clear_inbuf();
//若SIM未初始化完毕,以下指令显示 ERROR: SIM busy!
do{
delay(60000);
send_str("AT+CPMS=\"MT\",\"MT\",\"MT\"\r\0"); //首选短消息存储区
delay(60000);
while(!Wait_RI) //等待接收数据
{
WDT_CONTR=0x3e;
}
Wait_RI=0;
do{
if(inbufsign)
i=getbyte();
else
break;
}while(i!='K');
if(i=='K')
inbufsign=1;
else
{ inbufsign=0;
WDT_CONTR=0x3e;
delay(60000);
WDT_CONTR=0x3e;
delay(60000);
WDT_CONTR=0x3e;
delay(60000);
WDT_CONTR=0x3e;
}
}while(inbufsign==0);
WDT_CONTR=0x3e;
delay(60000);
send_str("AT+CNMI=2,2,0,0,1\r\0");
Wait_clear_inbuf();
//AT+CNMI 设置接收短消息模式
//AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>[,<bfr>]]]]]
//mode - 通知方式:
//" 0 - 不通知TE。
//" 1 - 只在数据线空闲的情况下,通知TE;否则不通知TE。
//" 2 - 通知TE。在数据线被占用的情况下,先缓冲起来,待数据线空闲,再行通知。
//" 3 - 通知TE。在数据线被占用的情况下,通知混合在数据中一起传输。
//mt - 消息储存或直接转发到TE:
//" 0 - 储存到默认的内存位置(包括class 3)
//" 1 - 储存到默认的内存位置,并且向TE发出通知(包括class 3)
//" 2 - 对于class 2,储存到SIM卡,并且向TE发出通知;对于其它class,直接将消息转发到TE
//" 3 - 对于class 3,直接将消息转发到 TE;对于其它class,同mt=1
//bm - 短消息广播 0 不发给TE;1 发给TE
//ds - 状态报告 0 不发给TE;1 发给TE
//bfr - 在<mode>=1,2,3时URC的TA缓冲区被清除.一般设置为1.
//短消息类(class)的概念:根据指定储存的位置,短消息分为class 0 - 3四个类。
//也可以不指定类(no class),由ME按默认设置进行处理,存储到内存或者SIM卡中。
//在TPDU的TP-DCS字节中,当bit7-bit4为00x1, 01x1, 1111时,bit1-bit0指出消息所属类:
//" 00 - class 0:只显示,不储存
//" 01 - class 1:储存在ME内存中
//" 02 - class 2:储存在SIM卡中
//" 03 - class 3:直接传输到TE
//send_str("AT&W\r"); //保存设置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -