在线时间237 小时
UID146802
注册时间2015-3-6
NXP金币0
TA的每日心情 | 开心 2019-7-11 19:28 |
---|
签到天数: 141 天 连续签到: 1 天 [LV.7]常住居民III
金牌会员
 
- 积分
- 2492
- 最后登录
- 2020-9-16
|
在写程序前 还是要先对模块的GPRS通信 指令有所了解,都使用了哪些指令,这里使用的内置TCP协议,这样调试简单些AT指令分别为
AT+CGDCONT=1,"IP","CMNET"
AT+CIPHEAD=1
AT+CIPSTART="TCP","101.228.205.153","1001"
AT+CIPSEND
AT+CIPSHUT
调用这些指令就可以实现TCP的互连, 前提要与一个外网IP和端口连接 ,这里暂不对怎么设置外网互连,只做连接,及互发
先附 实现 代码更容易明白
- /*
- 使用PC4 PC3 COM2口做测试
- GSm的指令处理
- 使用模块为 SIM800或SIM900系列
- //-----------------------------------------
- GPRS 连接
- 使用模块为 SIM800或SIM900系列
- 在连GPRS前要发一条指令设置一下 接收字头
- 还有连接的接入点
- AT+CGDCONT=1,"IP","CMNET"
- 设置接收字头,
- AT+CIPHEAD=1
- 不使用透传
- AT+CIPMODE=0
- 连接 IP: 101.228.205.153下的 1001端口,使用TCP协议
- AT+CIPSTART="TCP","101.228.205.153","1001"
- //------------------
- GPRS 数据发送
- //发送指定多少内容的指令
- 1, AT+CIPSEND=10
- 2,收到 >号后 再向串口发送内容
- 3,等待发送成功或失败报文
- 断开网络连接
- AT+CIPSHUT
- //---------------------------
- // 实现方法流程
- 1,进行GSM初始化,保证GSM网络正常
- 2,进行GPRS指令初始化,就是连接前准备
- 3,进行TCP下的指定IP的连接
- 4,成功后进入TCP互发测试,失败后从第二步继续
- 5,收到TCP端口来的数据进行处理并回复,
- 6,如果收到断网指令,进入第2步重新开始
- 7,待加强。。。。。。。。
-
- */
复制代码
- //------------------------
- /*
- GPRS 连接
- 使用模块为 SIM800或SIM900系列
- 在连GPRS前要发一条指令设置一下 接收字头
- 还有连接的接入点
- AT+CGDCONT=1,"IP","CMNET"
- 设置接收字头,
- AT+CIPHEAD=1
- 不使用透传
- AT+CIPMODE=0
- 连接 IP: 101.228.205.153下的 1001端口,使用TCP协议
- AT+CIPSTART="TCP","101.228.205.153","1001"
- 断开网络连接
- AT+CIPSHUT
- */
- INT8U grsp_init(INT8U *str)
- {
- INT8U i,t;
-
- while(1){
- myDelay(500);
- if(gprs_init_state==0)//AT
- { strcpya(tmp_buff,"AT+CGDCONT=1,"IP","CMNET"\x0d");
- i=com1_send(str);
- if(i)
- {
- i= strsearch("OK",at_buff2);
- if(i) {gprs_init_state++;}
- }
- }
- else if(gprs_init_state==1)//
- { strcpya(tmp_buff,"AT+CIPHEAD=1\x0d");
- i=com1_send(tmp_buff);
- if(i)
- {
- i= strsearch("OK",at_buff2);
- if(i) {gprs_init_state++;}
- }
- }
- else if(gprs_init_state==2)
- { strcpya(tmp_buff,"AT\x0d");
- i=com1_send(tmp_buff);
- if(i)
- {
- i= strsearch("OK",at_buff2);
- if(i)
- {gprs_init_state++;}
- else
- { i= strsearch("ERROR",at_buff2);
- if(i)
- {gprs_init_state++;}
- }
-
- }
-
- }
- else if(gprs_init_state==3)//发送GPRS连接
- {
- strcpya(tmp_buff,"AT+CIPSTART="TCP","101.228.205.153","1001"\x0d");
- i=com1_send(tmp_buff);
- for(t=0;t<200;t++)
- { myDelay(100);
- i= strsearch("CONNECT OK",at_buff2);
- if(i)
- { gprs_init_state++;
- return (1);
- }
- else
- { i= strsearch("ERROR",at_buff2);
- if(i) break;
-
- }
- }
- //-AT+CIPSHUT
- strcpya(tmp_buff,"AT+CIPSHUT\x0d");
- i=com1_send(tmp_buff);
- for(t=0;t<200;t++)
- { myDelay(100);
- i= strsearch("OK",at_buff2);
- if(i)
- { break;
- }
- }
- gprs_init_state=0;
- }
-
-
-
- }
-
- }
复制代码- /*
- GSM 初始化
- 使用 AT指令
- ATE0V1 关回显,回复以OK方式
- AT+CPIN? 查询SIM卡有没有插入,如果没有SIM卡,模块不能做收费方面的测试
- AT+CREG? 查询网络是没有注册上,也就是有没有联上网络
- */
- void gsm_init(INT8U *str)
- {
- INT8U i;
-
- while(1){
- myDelay(500);
- if(gsm_state==0)//AT
- { strcpya(tmp_buff,"ATE0V1\x0d");
- i=com1_send(str);
- if(i)
- {
- /*AT OK
- 41 54 0D 0D 0A 4F 4B 0D 0A
- */
- i= strsearch("OK",at_buff2);
- if(i)
- {gsm_state++;}
-
- }
- }
- else if(gsm_state==1)//查询SIM卡是否正常 AT+CPIN?
- { strcpya(tmp_buff,"AT+CPIN?\x0d");
- i=com1_send(tmp_buff);
- if(i)
- { //SIM卡正常
- i= strsearch("+CPIN: READY",at_buff2);
- if(i) {gsm_state++;}
- }
- }
- else if(gsm_state==2)//查询GSM网络是否注册
- { strcpya(tmp_buff,"AT+CREG?\x0d");
- i=com1_send(tmp_buff);
- if(i)
- { // +CREG: 0,1 或("+CREG: 0,5 表示已经注册上网络
- i= strsearch("+CREG: 0,1",at_buff2);
- if(i) {gsm_state++;}
- else
- { i= strsearch("+CREG: 0,5",at_buff2);
- if(i)
- {gsm_state++;}
- else myDelay(100);
- }
- }
-
- }
- else if(gsm_state==3)//初始化通过
- { return ;
- }
-
-
-
- }
-
- }
- /*
- GPRS 数据发送
- //发送指定多少内容的指令
- 1, AT+CIPSEND=10
- 2,收到 >号后 再向串口发送内容
- 3,等待发送成功或失败报文
-
-
- */
- INT8U GPRS_SEND(INT8U *str,INT8U *code_str)
- { INT8U i,j;
- INT8U tmp_bu[4];
- for(i=0;i<=200;i++)
- { if(code_str[i]==0) break;
- }
- j=0;tmp_bu[j++]=(i/100)+'0';
- i=i%100;
- tmp_bu[j++]=(i/10)+'0';
- tmp_bu[j++]=(i%10)+'0';
- tmp_bu[j++]=0x0d;
- tmp_bu[j++]=0;
-
- strcpya(tmp_buff,"AT+CIPSEND=");
- strcata(tmp_buff,tmp_bu);
- i=com1_send(tmp_buff);
- myDelay(100);
-
- strcpya(tmp_buff,code_str);
- i=com1_send(tmp_buff);
-
- for(j=0;j<200;j++)
- { myDelay(100);
- i= strsearch("SEND OK",at_buff2);
- if(i)
- { gprs_init_state++;
- return (1);
- }
- }
- return(0);
- }
-
-
-
- /*
- 串口接收到的数据进行分析
- 可能是 GPRS或短信还有其它自动的报文都会自动上报
-
- */
- INT8U receive_com(INT8U *str,INT8U *code_str)
- { INT32U i;
- INT32U j=0,t;
- //----------------------------
- //GPRS 来的数据 以 +IPD,6:122133
- i= strsearch("+IPD,",str);
- if(i)
- {
- i=i+4;j=0;
- if(str[i]>'0'&&str[i]<='9')
- { j=str[i]-'0';i++;
- }
- if(str[i]>'0'&&str[i]<='9')
- { j=j*10;j=j+(str[i]-'0');i++;
- }
- if(str[i]>'0'&&str[i]<='9')
- { j=j*10;j=j+(str[i]-'0');i++;
- }
- i++;//跳过 ":"号
- for(t=0;t<j;t++)
- { code_str[t]= str[i++];
- }
- code_str[t+1]=0;
- return(1) ;
-
- }
- //------CLOSED------------------------
- i= strsearch("CLOSED",str);
- if(i)
- {
- gprs_init_state=0;
- }
-
-
- return(0) ;
- }
-
- /*
- GSM 处理主函数
- */
- void gsm_main(void)
- {
- INT32U i;
-
- //联网前 对模块进行初始化及 网络查询
- if(gsm_state==0)
- { gsm_init(tmp_buff);
- }
-
- if(gsm_state)//只有联上网络后才可以进行GPRS操作
- { if(gprs_init_state==0)
- {
- i= grsp_init(tmp_buff);
- if(i)
- { i++;
- }
- else gprs_init_state=0;
- }
- }
- //串口上收到内容
- if(at_cont2)
- { myDelay(200);
- i= receive_com(at_buff2,code_buff);
- if(i==1)//GPRS来的数据,做一个简单的回复
- { strcpya(code_buff,"ABCD_123456");
- GPRS_SEND(tmp_buff,code_buff);
- }
- for(i=0;i<200;i++) at_buff2[i]=0;
- at_cont2=0;
- }
-
-
-
- myDelay(200);
- myDelay(200);
- }
复制代码 针对串口的接收也就是TCP端收到的数据,采用自动接收方式 ,接收到的内容是放入at_buff2数组内,如果要查询都收到什么,只要针对 at_buff2操作就可以,其它软件上的其它内容请参照上一个代码 :LY_KL26Z板学习之GSM短信的接收与回复https://www.nxpic.org.cn/module/ ... p;page=1#pid2155316
连接图
软件效果图:
|
|