极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9754|回复: 2

用GSM模块连接乐联网

[复制链接]
发表于 2014-6-27 18:25:30 | 显示全部楼层 |阅读模式
目前有一版本可以 稳定的上传数据,需要的朋友留下邮箱。
下面的这个程序有点问题,板子是mega2560,我设置定时器为50ms中断,在中断服务函数中读取串口的数据到buffer中。然后在loop里面循环查找字符串,出现的问题是只能找到一次,后面的就不行了。上图:代码如下:

  1. #include <FlexiTimer2.h>
  2. #include <avr/wdt.h>

  3. #define BAUD 115200

  4. #define BufferLength 256                                         //接收缓冲区长度//
  5. char buffer[BufferLength];                                        //接收缓冲区//
  6. int RecieveCount=0;                                                //接收缓冲区计数//

  7. #define TIMERPERIOD  60                                         //定时器设置为每50ms中断一次
  8. #define TIMERCOUNT (50000/TIMERPERIOD)                            //每50s发送一次心跳。
  9. int SystemTimeCount=0;                  

  10. #define TRYTIMES 100                                                //发送一条指令,循环检测返回值的次数//

  11. #define SendCmdSpeed  3000

  12. #define DEBUG


  13. bool LED=0;
  14. bool LWOnline=0;                                                //乐联网在线标志, LWOnline=1,乐联网在线
  15. bool TCPOnline=0;                                                //TCP 在线标记     TCPOnline=1 TCP在线

  16. int PresentBufferLength=0;

  17. void setup()
  18. {
  19.   Serial.begin(BAUD);
  20.   pinMode(13,OUTPUT);                                                //上电后需要11秒左右完成相关的网络注册
  21.   Serial.println("ATE0");
  22.   delay(2000);
  23.   FlexiTimer2::set(TIMERPERIOD,TimerISR);                                // 中断设置函数,每 TIMERPERIOD ms 进入一次count
  24.   FlexiTimer2::start();                                             //开始计
  25.   wdt_enable(WDTO_120MS); //开启看门狗,并设置溢出时间为60MS
  26.   interrupts();
  27. }

  28. void TimerISR()
  29. {
  30.   wdt_reset(); //喂狗操作,使看门狗定时器复位
  31.   
  32.   //-----------------------------------------------------------//
  33.   //读取串口数据到缓冲区,一次性读完当前串口的所有数据//
  34.    while(Serial.available()>0)
  35.      {
  36.        if(RecieveCount >= BufferLength )
  37.          RecieveCount=0;
  38.             buffer[RecieveCount++]=Serial.read();
  39.         digitalWrite(13,(LED^=1));
  40.      }
  41.     // Serial.println("the buffer is:");
  42.     // Serial.println(buffer);
  43. //----------------------------------------------------------------//
  44. }

  45. void loop()
  46. {   
  47.     if(TCPOnline == 0)
  48.       {
  49.         InitGsm();
  50.          if(TCPOnline)  
  51.           Serial.println("TCPOnline");     
  52.       }
  53.     if(LWOnline == 0)
  54.       {
  55.          RegisterLewei();
  56.          if(LWOnline)  
  57.           Serial.println("LWOnline");
  58.           TCPOnline=0;
  59.       }
  60. }
  61. //-----------------------------------------------------------------------------------------------------------------//
  62. /*
  63. 函数作用:发送cmd给GSM模块,目标返回respond ,enter是否发送回车,enter=1发送回车,否则不发
  64. 函数说明:如果在指定次数内没有得到
  65. */
  66. char SendCmd(String cmd,boolean enter,boolean mulrespond,char *respond,char *respond2,char *ErrorCode)
  67. {
  68.   bool SearchRusult=0;
  69.   unsigned char i=0;
  70.   char *add1=NULL;
  71.   char *add2=NULL;
  72.   char *add3=NULL;
  73. //------------------------------------------------------------------//
  74. //发送数据
  75.   if(enter==1)
  76.     {
  77.       Serial.println(cmd);
  78.     }
  79.   else
  80.     {
  81.        Serial.print(cmd);
  82.     }
  83.    delay(SendCmdSpeed);
  84.   //----------------------------------------------------------------//  
  85.   //等待GSM模块返回响应//
  86.    add1=add2=add3=NULL;
  87.     for(i=0;i<TRYTIMES;i++)
  88.       {
  89.             add1 = strstr(buffer,respond);               
  90.         if(mulrespond == 1)
  91.                   add2 = strstr(buffer,respond2);
  92.         add3 = strstr(buffer,ErrorCode);                                                                                        //等待缓冲区更新一次数据//
  93.         if(add1 != NULL )
  94.           {
  95.             add1 = NULL;
  96.             CleanBuffer1(buffer,respond);
  97.             return 1;
  98.           }
  99.           if(add2 != NULL && mulrespond==1)
  100.           {
  101.             add2 = NULL;
  102.             //CleanBuffer1(buffer,add2);
  103.             CleanBuffer1(buffer,respond2);
  104.             return 1;
  105.           }
  106.         if(add3 != NULL)
  107.           {
  108.             add3 = NULL;
  109.            // SendCmd("ATE0",1,0,"OK",NULL,"ERROR");                        //发送ATE0 可以让整个系统重新,回归正常//
  110.             CleanBuffer1(buffer,ErrorCode);
  111.             return 0;
  112.           }
  113.          //delay(50);      
  114.       }
  115.     return 0;  
  116.    //--------------------------------------------------------------//  
  117. }
  118. //---------------------------------------------------------------------------------------------------------------------//
  119. /*
  120. 函数作用:清除当前字符串占用的缓存
  121. 函数说明:null
  122. */
  123. int CleanBuffer1(char *str,char const *substr)
  124. {
  125.   if(str == NULL || substr == NULL)
  126.     {
  127.       return 0;
  128.     }
  129.   //标记str中substr开始的位置
  130.   char * begin = str;
  131.   //标记str中substr结束的位置
  132.   char * end = str;
  133.   //substr用于比较的游标指针
  134.   char const * index = substr;
  135.   while(*begin != '\0' && *end != '\0')
  136.     {
  137.       //在str中寻找substr
  138.       while(*begin != *index)
  139.         {
  140.           begin++;
  141.         }
  142.       end = begin + 1;
  143.       index++;
  144.       while(*index == *end && *index != '\0' && *end != '\0')
  145.         {
  146.           index++;
  147.           end++;
  148.         }
  149.       //如果index和end同时到达各自的字符串尾部,substr子串在str中被找到
  150.       //例如str:"abcdeXYZ",substr:"XYZ"
  151.       if(*index == '\0' && *end == '\0')
  152.         {
  153.           *begin = '\0';
  154.           //printf(str);
  155.           return 1;
  156.         }
  157.       /* 如果index到达substr字符串尾部,而end没有到达str的尾部,substr子串在str中被找到
  158.        * 例如str:"abcdeXYZmn",substr:"XYZ"
  159.       */
  160.       else
  161.         if(*index == '\0' && *end != '\0')
  162.           {
  163.              while(*begin++ = *end++);
  164.              //printf(str);
  165.              return 1;
  166.           }
  167.       /* 如果index未到达substr字符串尾部,而end有到达str的尾部,substr子串在str中未被找到
  168.        * 例如str:"abcdeXYZmn",substr:"XYZmnST"
  169.        */
  170.       else
  171.         if(*index != '\0' && *end == '\0')
  172.           {
  173.             //printf(str);
  174.             return 0;
  175.           }
  176.         /*字符串匹配尚未完成
  177.         * 例如str:"XYZabcdeXYZmnSTghd",substr:"XYZmnST"
  178.         */
  179.           else
  180.             {
  181.               begin++;
  182.               end = begin;
  183.               index = substr;
  184.              }
  185.         }
  186.     return 0;
  187. }
  188. //---------------------------------------------------------------------------------------------------------------------//
  189. /*
  190. 函数功能:注册乐联网,也是心跳//
  191. 函数说明:注册成功,LWOnline=1 否则LWOnline=0//
  192. */
  193. void RegisterLewei()
  194. {
  195.   char i=0;
  196.   if(TCPOnline==1)
  197.     {
  198.       i=SendCmd("AT+CIPSEND",1,0,"FAN",">","ERROR");
  199.       if(i)
  200.         LWOnline=SendCmd("{"method":"update","gatewayNo":"01","userkey":"b8ad506aa60a4326a4d1365fc75e07bc"}&^!32",0,0,"SEND OK"," ","ERROR");
  201.     }
  202. }
  203. //---------------------------------------------------------------------------------------------------------------------//
  204. /*
  205. 函数功能:初始化GSM模块,使其进入TCP数据传输模式//
  206. 函数说明:初始化成功 TCPOnline=1,否则TCPOnline=0
  207. */
  208. void  InitGsm()
  209. {
  210.   TCPOnline=SendCmd("AT+CIPSTART="TCP","42.121.128.216","9960"",1,1,"CONNECT","ALREADY CONNECT","ERROR");
  211. // TCPOnline=SendCmd("AT+CIPSEND",1,1,">",">","ERROR");
  212. }
  213. //---------------------------------------------------------------------------------------------------------------------//
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-5-3 20:23:13 | 显示全部楼层
学习了,程序不错
回复 支持 反对

使用道具 举报

发表于 2016-10-1 21:41:09 | 显示全部楼层
[email protected]    谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 13:46 , Processed in 0.041489 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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