查看: 3115|回复: 4

[分享] LY_KL26Z板学习之 SIMCOM模块的TCP通信

[复制链接]
  • TA的每日心情
    开心
    2019-7-11 19:28
  • 签到天数: 141 天

    连续签到: 1 天

    [LV.7]常住居民III

    34

    主题

    1067

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2492
    最后登录
    2020-9-16
    发表于 2015-10-8 19:23:23 | 显示全部楼层 |阅读模式
    在写程序前 还是要先对模块的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和端口连接 ,这里暂不对怎么设置外网互连,只做连接,及互发
    先附 实现 代码更容易明白

    1. /*
    2. 使用PC4 PC3 COM2口做测试
    3. GSm的指令处理
    4. 使用模块为 SIM800或SIM900系列
    5. //-----------------------------------------
    6. GPRS 连接
    7. 使用模块为 SIM800或SIM900系列
    8. 在连GPRS前要发一条指令设置一下 接收字头
    9. 还有连接的接入点
    10. AT+CGDCONT=1,"IP","CMNET"
    11. 设置接收字头,
    12. AT+CIPHEAD=1
    13. 不使用透传
    14. AT+CIPMODE=0
    15. 连接 IP: 101.228.205.153下的 1001端口,使用TCP协议
    16. AT+CIPSTART="TCP","101.228.205.153","1001"
    17. //------------------
    18. GPRS 数据发送
    19. //发送指定多少内容的指令
    20. 1,                AT+CIPSEND=10
    21. 2,收到 >号后 再向串口发送内容
    22. 3,等待发送成功或失败报文

    23. 断开网络连接
    24. AT+CIPSHUT
    25. //---------------------------
    26. // 实现方法流程
    27. 1,进行GSM初始化,保证GSM网络正常
    28. 2,进行GPRS指令初始化,就是连接前准备
    29. 3,进行TCP下的指定IP的连接
    30. 4,成功后进入TCP互发测试,失败后从第二步继续
    31. 5,收到TCP端口来的数据进行处理并回复,
    32. 6,如果收到断网指令,进入第2步重新开始
    33. 7,待加强。。。。。。。。

    34. */
    复制代码

    1. //------------------------
    2. /*
    3. GPRS 连接
    4. 使用模块为 SIM800或SIM900系列
    5. 在连GPRS前要发一条指令设置一下 接收字头
    6. 还有连接的接入点
    7. AT+CGDCONT=1,"IP","CMNET"
    8. 设置接收字头,
    9. AT+CIPHEAD=1
    10. 不使用透传
    11. AT+CIPMODE=0
    12. 连接 IP: 101.228.205.153下的 1001端口,使用TCP协议
    13. AT+CIPSTART="TCP","101.228.205.153","1001"
    14. 断开网络连接
    15. AT+CIPSHUT

    16. */
    17. INT8U grsp_init(INT8U *str)
    18. {
    19.     INT8U i,t;
    20.        
    21.     while(1){
    22.                            myDelay(500);
    23.                     if(gprs_init_state==0)//AT       
    24.                                 {  strcpya(tmp_buff,"AT+CGDCONT=1,"IP","CMNET"\x0d");  
    25.                                          i=com1_send(str);  
    26.                                          if(i)
    27.                                    {  
    28.                                           i= strsearch("OK",at_buff2);
    29.                                            if(i)  {gprs_init_state++;}
    30.                                    }
    31.                          }
    32.                                 else  if(gprs_init_state==1)//
    33.                                 {   strcpya(tmp_buff,"AT+CIPHEAD=1\x0d");
    34.                                           i=com1_send(tmp_buff);  
    35.                                           if(i)
    36.                                    {  
    37.                                           i= strsearch("OK",at_buff2);
    38.                                            if(i)  {gprs_init_state++;}
    39.                                    }
    40.                          }
    41.                                 else  if(gprs_init_state==2)
    42.                                 {   strcpya(tmp_buff,"AT\x0d");
    43.                                           i=com1_send(tmp_buff);  
    44.                                            if(i)
    45.                                    {  
    46.                                             i= strsearch("OK",at_buff2);
    47.                                             if(i)
    48.                 {gprs_init_state++;}
    49.                                                  else
    50.                                                  {         i= strsearch("ERROR",at_buff2);
    51.                                               if(i)
    52.                 {gprs_init_state++;}
    53.                                                         }
    54.                                                  
    55.                                    }
    56.                                          
    57.                          }
    58.         else  if(gprs_init_state==3)//发送GPRS连接
    59.                                   {
    60.            strcpya(tmp_buff,"AT+CIPSTART="TCP","101.228.205.153","1001"\x0d");
    61.                                          i=com1_send(tmp_buff);   
    62.                   for(t=0;t<200;t++)
    63.                                           {          myDelay(100);
    64.                                               i= strsearch("CONNECT OK",at_buff2);
    65.                                              if(i)
    66.                                                          {   gprs_init_state++;
    67.                                                             return (1);
    68.                                                          }
    69.                else
    70.                                                          {   i= strsearch("ERROR",at_buff2);
    71.                                                if(i) break;
    72.                                                          
    73.                                                          }                                                                 
    74.                                           }
    75.                                                 //-AT+CIPSHUT
    76.                                                  strcpya(tmp_buff,"AT+CIPSHUT\x0d");
    77.                                           i=com1_send(tmp_buff);  
    78.                                           for(t=0;t<200;t++)
    79.                                           {          myDelay(100);
    80.                                               i= strsearch("OK",at_buff2);
    81.                                              if(i)
    82.                                                          {  break;
    83.                                                          }                  
    84.                                           }
    85.                                                 gprs_init_state=0;
    86.                                         }
    87.                                           
    88.                                                                            
    89.                                     
    90.                          }                               
    91.                          

    92.     }
    复制代码
    1. /*
    2. GSM 初始化
    3. 使用 AT指令
    4. ATE0V1 关回显,回复以OK方式
    5. AT+CPIN? 查询SIM卡有没有插入,如果没有SIM卡,模块不能做收费方面的测试
    6. AT+CREG? 查询网络是没有注册上,也就是有没有联上网络

    7. */
    8. void gsm_init(INT8U *str)
    9. {
    10.     INT8U i;
    11.        
    12.     while(1){
    13.                            myDelay(500);
    14.                     if(gsm_state==0)//AT       
    15.                                 {  strcpya(tmp_buff,"ATE0V1\x0d");  
    16.                                          i=com1_send(str);  
    17.                                          if(i)
    18.                                    {  
    19.                                          /*AT OK
    20.                                            41 54 0D 0D 0A 4F 4B 0D 0A
    21.                                          */
    22.                                           i= strsearch("OK",at_buff2);
    23.                                            if(i)
    24.                                             {gsm_state++;}
    25.                                           
    26.                                    }
    27.                          }
    28.                                 else  if(gsm_state==1)//查询SIM卡是否正常   AT+CPIN?       
    29.                                 {   strcpya(tmp_buff,"AT+CPIN?\x0d");
    30.                                           i=com1_send(tmp_buff);  
    31.                                          if(i)
    32.                                    {  //SIM卡正常
    33.                                                  i= strsearch("+CPIN: READY",at_buff2);
    34.                                            if(i) {gsm_state++;}                                           
    35.                                    }
    36.                          }
    37.                                 else  if(gsm_state==2)//查询GSM网络是否注册
    38.                                 {   strcpya(tmp_buff,"AT+CREG?\x0d");
    39.                                           i=com1_send(tmp_buff);  
    40.                                          if(i)
    41.                                    {  // +CREG: 0,1 或("+CREG: 0,5 表示已经注册上网络
    42.                                                  i= strsearch("+CREG: 0,1",at_buff2);
    43.                                            if(i) {gsm_state++;}        
    44.              else
    45.              {   i= strsearch("+CREG: 0,5",at_buff2);
    46.                                                if(i)
    47.                   {gsm_state++;}
    48.                                                                  else         myDelay(100);
    49.                                                  }                                                         
    50.                                    }
    51.                                          
    52.                          }
    53.                  else  if(gsm_state==3)//初始化通过
    54.                                   {  return ;
    55.                                         }
    56.                                           
    57.                                                                            
    58.                                     
    59.                          }                               
    60.                          

    61.     }
    62. /*
    63. GPRS 数据发送
    64. //发送指定多少内容的指令
    65. 1,                AT+CIPSEND=10
    66. 2,收到 >号后 再向串口发送内容
    67. 3,等待发送成功或失败报文
    68.                
    69.                
    70. */

    71. INT8U  GPRS_SEND(INT8U *str,INT8U *code_str)       
    72. {  INT8U i,j;
    73.          INT8U tmp_bu[4];
    74.           for(i=0;i<=200;i++)
    75.          { if(code_str[i]==0) break;
    76.          }
    77.    j=0;tmp_bu[j++]=(i/100)+'0';
    78.          i=i%100;
    79.          tmp_bu[j++]=(i/10)+'0';
    80.          tmp_bu[j++]=(i%10)+'0';
    81.           tmp_bu[j++]=0x0d;
    82.          tmp_bu[j++]=0;
    83.          
    84.            strcpya(tmp_buff,"AT+CIPSEND=");
    85.                  strcata(tmp_buff,tmp_bu);
    86.                                          i=com1_send(tmp_buff);  
    87.                                          myDelay(100);
    88.              
    89.            strcpya(tmp_buff,code_str);  
    90.                                          i=com1_send(tmp_buff);  
    91.          
    92.           for(j=0;j<200;j++)
    93.                                           {          myDelay(100);
    94.                                               i= strsearch("SEND OK",at_buff2);
    95.                                              if(i)
    96.                                                          {   gprs_init_state++;
    97.                                                             return (1);
    98.                                                          }                  
    99.                                           }
    100.                                                 return(0);
    101. }               
    102.                
    103.                
    104.                
    105. /*
    106.         串口接收到的数据进行分析

    107. 可能是 GPRS或短信还有其它自动的报文都会自动上报               
    108.                
    109.         */
    110. INT8U  receive_com(INT8U *str,INT8U *code_str)
    111. { INT32U  i;
    112.     INT32U  j=0,t;   
    113.                         //----------------------------
    114.      //GPRS 来的数据  以 +IPD,6:122133
    115.                           i= strsearch("+IPD,",str);
    116.                           if(i)
    117.                                 {
    118.                                    i=i+4;j=0;
    119.                                           if(str[i]>'0'&&str[i]<='9')
    120.                                                 {  j=str[i]-'0';i++;
    121.                                                 }
    122.                                                  if(str[i]>'0'&&str[i]<='9')
    123.                                                 {  j=j*10;j=j+(str[i]-'0');i++;
    124.                                                 }
    125.                                                  if(str[i]>'0'&&str[i]<='9')
    126.                                                 {  j=j*10;j=j+(str[i]-'0');i++;
    127.                                                 }
    128.                                                 i++;//跳过  ":"号
    129.                                                 for(t=0;t<j;t++)
    130.                                                 {  code_str[t]= str[i++];
    131.                                                 }
    132.                                      code_str[t+1]=0;
    133.                                                 return(1) ;       
    134.                                                
    135.                                 }                       
    136.                         //------CLOSED------------------------
    137.                                  i= strsearch("CLOSED",str);
    138.                           if(i)
    139.                                 {
    140.                                    gprs_init_state=0;
    141.                                 }
    142.                                
    143.                                
    144.                                 return(0) ;               
    145. }

    146.        

    147. /*
    148. GSM 处理主函数
    149. */
    150. void gsm_main(void)
    151. {  
    152.      INT32U  i;
    153.             
    154.            //联网前 对模块进行初始化及 网络查询
    155.           if(gsm_state==0)
    156.                 {  gsm_init(tmp_buff);
    157.                 }
    158.   
    159.                  if(gsm_state)//只有联上网络后才可以进行GPRS操作
    160.                  {  if(gprs_init_state==0)
    161.                     {
    162.                                         i= grsp_init(tmp_buff);
    163.                                         if(i)
    164.                                         { i++;
    165.                                         }
    166.                                         else gprs_init_state=0;
    167.                                 }
    168.                  }
    169.                  //串口上收到内容
    170.                  if(at_cont2)
    171.                  {   myDelay(200);       
    172.                          i= receive_com(at_buff2,code_buff);
    173.                          if(i==1)//GPRS来的数据,做一个简单的回复
    174.                          { strcpya(code_buff,"ABCD_123456");
    175.                             GPRS_SEND(tmp_buff,code_buff);
    176.                          }
    177.                            for(i=0;i<200;i++) at_buff2[i]=0;
    178.                     at_cont2=0;
    179.                  }
    180.                  
    181.                  
    182.          
    183.     myDelay(200);       
    184.           myDelay(200);       

    185. }
    复制代码
    针对串口的接收也就是TCP端收到的数据,采用自动接收方式 ,接收到的内容是放入at_buff2数组内,如果要查询都收到什么,只要针对 at_buff2操作就可以,其它软件上的其它内容请参照上一个代码 :LY_KL26Z板学习之GSM短信的接收与回复https://www.nxpic.org.cn/module/ ... p;page=1#pid2155316

    连接图

    GSM-连接图.jpg
    软件效果图:
    123.jpg








    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-10-9 09:43:49 | 显示全部楼层
    不错,又是GSM。。
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-10-9 18:47:06 | 显示全部楼层
    顶起               
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-6-15 16:35
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    50

    主题

    159

    帖子

    0

    高级会员

    Rank: 4

    积分
    549
    最后登录
    2023-3-11
    发表于 2015-10-10 02:55:00 | 显示全部楼层
    学习下~~~~~~~~~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-10-10 15:04:38 | 显示全部楼层
    学习              
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-29 05:04 , Processed in 0.090088 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表