极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15406|回复: 9

sim900a读取短信之后TCP通信就无法进行。。

[复制链接]
发表于 2014-9-10 19:33:21 | 显示全部楼层 |阅读模式
我想请教一个问题,我用arduino mega 2560连sim900a实现了两个功能,一个是读短信条数,读取短信,删除短信,第二个是TCP连接,两个功能单独实现能成功,但是合在一起TCP就无法连接,请问这是怎么回事。
  1. #include <Narcoleptic.h>
  2. #include <EEPROM.h>
  3. #include <SPI.h>
  4. #include <stdlib.h>
  5. int dustPin = 0;                                        //从A0读扬尘值
  6. int ledPower = 2;                                      //扬尘传感器的LED灯开关接引脚2
  7. int pmof = 3;                                         //控制扬尘传感器的开关是3号引脚
  8. int noiseof = 4;                                     //控制噪声传感器的开关是4号引脚
  9. int simof = 5;                                       //控制sim900a的开关是5号引脚
  10. int duanxinnum = 0;                                    //短信的条数
  11. int sleeptime = 0, noisenum = 0;                      //睡眠时间和噪音测量时间
  12. String ip = "";                                     //TCP连接时发送用的
  13. String port = "";                                   //TCP连接时发送用的
  14. String iphex = "";                                  //存放ip的8个十六进制字符
  15. int ipdec[4] = {0};                                //ip四段的十进制数字
  16. int porteeprom1 = 0, porteeprom2 = 0 ;              //两字节的端口号
  17. unsigned char noise = 0;                          //噪声值
  18. int pm = 0;                                       //扬尘值,在0到500之间
  19. unsigned char pmh = 0, pml = 0;                    //扬尘高位值和低位的值
  20. unsigned char datasend[11] = {0};                 //要发送的11个字节的数组
  21. unsigned char datarece[60] = {0};                 //接收数据的数组
  22. void setup() {
  23.   Serial.begin(9600);
  24.   Serial2.begin(2400);
  25.   Serial3.begin(9600);
  26.   pinMode(ledPower, OUTPUT);                  //2号引脚设为输出
  27.   pinMode(pmof, OUTPUT);                  //3号引脚设为输出
  28.   pinMode(noiseof, OUTPUT);                  //4号引脚设为输出
  29.   pinMode(simof, OUTPUT);                  //5号引脚设为输出
  30. }

  31. void loop() {
  32.   chushihua();
  33. //  chulismsip();
  34.   while(1)
  35.   {
  36.   digitalWrite(simof, HIGH);              //打开sim900a
  37.   digitalWrite(pmof, HIGH);
  38.   delay(18000);
  39.   pm = getpmnum();
  40.   pml = pm % 256;                          //低位的pm值
  41.   pmh = (pm - pml) / 256;                 //高位的pm值
  42.   digitalWrite(pmof, LOW);
  43.   //   noise = maxnoise(EEPROM.read(7));                  //得到噪声值
  44.   noise = 62;
  45.   duanxinnum = SMSnum();
  46.   if ((duanxinnum > 0) && (duanxinnum < 10))
  47.   {
  48.     chuliduanxin(duanxinnum);
  49.     xierueeprom();
  50.   }
  51.   delallsms();
  52.    package();
  53.   tcplink();
  54.   digitalWrite(simof, LOW);              //关闭sim900a
  55.   delay(2000);
  56.   sleepmode(EEPROM.read(6));
  57.   }
  58. //  Serial.println(EEPROM.read(8));
  59. //  Serial.println(EEPROM.read(9));
  60. //  Serial.println(EEPROM.read(10));
  61. // Serial.println(EEPROM.read(11));
  62. // Serial.println(EEPROM.read(12));
  63. // Serial.println();
  64.   //  Serial.println(sleeptime);
  65.   //  Serial.println(noisenum);
  66.   //  Serial.println(ip);
  67.   // Serial.println(port);
  68.   // Serial.print(iphex);
  69. //  Serial.println(pm);
  70. // Serial.println(pmh);
  71. //  Serial.println(pml);
  72.   delay(5000);

  73. }


  74. int SMSnum()                              //get the num of sms
  75. {
  76.   String datasim = "";
  77.   int i = 0, mark = 0, num = 0;
  78.   Serial3.print("AT+CPMS=");
  79.   Serial3.print('"');
  80.   Serial3.print("SM");
  81.   Serial3.print('"');
  82.   Serial3.print("\r\n");
  83.   delay(1000);
  84.   while (Serial3.available() > 0)
  85.   {
  86.     //读入之后将字符串,串接到comdata上面。
  87.     datasim += char(Serial3.read());
  88.     //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
  89.     delay(2);
  90.     //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
  91.     mark = 1;
  92.   }
  93.   if (mark == 1)
  94.     // {
  95.     //  Serial.println(datasim.length());
  96.     // for (i = 0; i < datasim.length(); i++)
  97.     // {
  98.     //    Serial.print(datasim[i]);
  99.     //    delay(100);
  100.     //  }
  101.     // Serial.print(datasim[23]);
  102.     num = int(datasim[23]) - 48;
  103.   // Serial.print(num);
  104.   //  datasim = "";
  105.   //  delay(1000);
  106.   //  mark = 0;
  107.   //   }
  108.   return num;
  109. }


  110. void  chuliduanxin(int n)    //fen 9 tiao du duan xin
  111. {
  112.   int i = 1;
  113.   //  Serial.println(n);
  114.   for (i = 1; i <= n; i++)
  115.   {
  116.     switch (i)
  117.     {
  118.       case 1:
  119.         {
  120.           Serial3.print("AT+CMGR=1\r\n");
  121.           chulisms();
  122.           break;
  123.         }
  124.       case 2:
  125.         {
  126.           Serial3.print("AT+CMGR=2\r\n");
  127.           chulisms();
  128.           break;
  129.         }
  130.       case 3:
  131.         {
  132.           Serial3.print("AT+CMGR=3\r\n");
  133.           chulisms();
  134.           break;
  135.         }
  136.       case 4:
  137.         {
  138.           Serial3.print("AT+CMGR=4\r\n");
  139.           chulisms();
  140.           break;
  141.         }
  142.       case 5:
  143.         {
  144.           Serial3.print("AT+CMGR=5\r\n");
  145.           chulisms();
  146.           break;
  147.         }
  148.       case 6:
  149.         {
  150.           Serial3.print("AT+CMGR=6\r\n");
  151.           chulisms();
  152.           break;
  153.         }
  154.       case 7:
  155.         {
  156.           Serial3.print("AT+CMGR=7\r\n");
  157.           chulisms();
  158.           break;
  159.         }
  160.       case 8:
  161.         {
  162.           Serial3.print("AT+CMGR=8\r\n");
  163.           chulisms();
  164.           break;
  165.         }
  166.       case 9:
  167.         {
  168.           Serial3.print("AT+CMGR=9\r\n");
  169.           chulisms();
  170.           break;
  171.         }
  172.     }
  173.   }
  174. }

  175. void chulisms()           //get sms and deal with it
  176. {
  177.   int a = 0, mark = 0, i = 0, douhaonum = 0, j = 0, k = 0, p = 0, first = 0, second = 0;
  178.   int b = 0, m = 0, n = 0;
  179.   unsigned long telnum = 0 ;                              //电话号码后9位的十进制数
  180.   unsigned long time0 = 0, time1 = 0;                    //记录程序运行的时间差,超过就退出
  181.   unsigned long int tempip = 0;                                 //字符型转化为长整型ip的值
  182.   long int tempport = 0;                                     //字符型转化为长整型Port的值
  183.   int douhao[4] = {0};                                   //逗号出现的位置
  184.   String datasim = "";
  185.   char datafirst[25];                                 //第二个和第三个逗号之间
  186.   char datasecond[25];                              //第三个和第四个逗号之间
  187.   int datajia1[5] = {0};                                //电话号码的前两位的五位八进制
  188.   int datajia2[5] = {0};                                //电话号码的后9位的五位八进制
  189.   int datajia3[5] = {0};                                //电话号码的进位的五位八进制
  190.   for (a = 0 ; a < 2; a++)
  191.   {
  192.     time0 = millis();
  193.     while (!Serial3.available())                    //wait until data appear
  194.     {
  195.       time1 = millis();
  196.       if ((time1 - time0) > 2000)                   //两秒还没有就退出等待
  197.         break;
  198.     }
  199.     while (Serial3.available() > 0)
  200.     {

  201.       datasim += char(Serial3.read());
  202.       //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
  203.       delay(2);
  204.       //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
  205.       mark = 1;
  206.     }
  207.   }

  208.   if (mark == 1)            // deal with sms
  209.   {
  210.    // Serial.println(datasim.length());
  211.     //for (i = 0; i < datasim.length(); i++)
  212.    // {
  213.      // Serial.print(datasim[i]);
  214.      // delay(30);
  215.   //  }
  216.     for (i = 0; i < (datasim.length()); i++)
  217.     {
  218.       if (datasim[i] == 'Z')
  219.         if (datasim[i + 1] == 'N')
  220.           if (datasim[i + 2] == 'G')
  221.             if (datasim[i + 3] == 'Y')        //add a if jiaoyan
  222.             {
  223.               if (datasim[i + 5] == '2')
  224.               {
  225.                 for (j = i; j < i + 28; j++)       //标记逗号在datasim里的位置
  226.                 {
  227.                   if (datasim[j] == ',')
  228.                   {
  229.                     douhao[douhaonum] = j;
  230.                     douhaonum++;
  231.                   }
  232.                 }
  233.                 for (k = douhao[1] + 1; k < douhao[2]; k++) //逗号2和逗号3之间的赋给datafirst
  234.                 {
  235.                   datafirst[first] = datasim[k];
  236.                   first++;
  237.                 }
  238.                 datafirst[first] = '\0';
  239.                 for (p = douhao[2] + 1; p < douhao[3]; p++) //逗号3和逗号4之间的赋给datasecond
  240.                 {
  241.                   datasecond[second] = datasim[p];
  242.                   second++;
  243.                 }
  244.                 datasecond[second] = '\0';
  245.                 tempip = atol(datafirst);
  246.                 tempport = atol(datasecond);
  247.                 PrintHex(tempip);
  248.                 ipdec[0] = hextodec(iphex[0], iphex[1]);            //将ip从十六进制转化为4段十进制数
  249.                 ipdec[1] = hextodec(iphex[2], iphex[3]);
  250.                 ipdec[2] = hextodec(iphex[4], iphex[5]);
  251.                 ipdec[3] = hextodec(iphex[6], iphex[7]);
  252.                 dectostring(ipdec[0], ipdec[1], ipdec[2], ipdec[3]);    //将十进制数转化成ip字符串
  253.                 port = "";
  254.                 for (b = 0; b < 8; b++)
  255.                 {
  256.                   if (datasecond[b] == '\0')
  257.                     break;
  258.                   port += datasecond[b];
  259.                 }
  260.                 porteeprom2 = tempport % 256;
  261.                 porteeprom1 = (tempport - porteeprom2) / 256;


  262.                 Serial.println(tempip);
  263.                 Serial.println(tempport);

  264.               }
  265.               if (datasim[i + 5] == '3')
  266.               {
  267.                 for (j = i; j < i + 20; j++)       //标记逗号在datasim里的位置
  268.                 {
  269.                   if (datasim[j] == ',')
  270.                   {
  271.                     douhao[douhaonum] = j;
  272.                     douhaonum++;
  273.                   }
  274.                 }
  275.                 for (k = douhao[1] + 1; k < douhao[2]; k++) //逗号2和逗号3之间的赋给datafirst
  276.                 {
  277.                   datafirst[first] = datasim[k];
  278.                   first++;
  279.                 }
  280.                 datafirst[first] = '\0';
  281.                 for (p = douhao[2] + 1; p < douhao[3]; p++) //逗号3和逗号4之间的赋给datasecond
  282.                 {
  283.                   datasecond[second] = datasim[p];
  284.                   second++;
  285.                 }
  286.                 datasecond[second] = '\0';
  287.                 sleeptime = atoi(datafirst);
  288.                 noisenum = atoi(datasecond);

  289.               }
  290.               if (datasim[i + 5] == '6')
  291.               {
  292.                 for (j = i; j < i + 25; j++)       //标记逗号在datasim里的位置
  293.                 {
  294.                   if (datasim[j] == ',')
  295.                   {
  296.                     douhao[douhaonum] = j;
  297.                     douhaonum++;
  298.                   }
  299.                 }
  300.                 for (k = douhao[1] + 3; k < douhao[2]; k++) //逗号2和逗号3之间的赋给datafirst
  301.                 { //datafirst存储电话号码后九位的字符串
  302.                   datafirst[first] = datasim[k];
  303.                   first++;
  304.                 }
  305.                 datafirst[first] = '\0';
  306.                 telnum = atol(datafirst);                 //后九位从字符串转换为十进制数
  307.                 datajia2[4] = bitRead(telnum, 0) + bitRead(telnum, 1) * 2 + bitRead(telnum, 2) * 4 + bitRead(telnum, 3) * 8 + bitRead(telnum, 4) * 16 + bitRead(telnum, 5) * 32 + bitRead(telnum, 6) * 64 + bitRead(telnum, 7) * 128;
  308.                 datajia2[3] = bitRead(telnum, 8) + bitRead(telnum, 9) * 2 + bitRead(telnum, 10) * 4 + bitRead(telnum, 11) * 8 + bitRead(telnum, 12) * 16 + bitRead(telnum, 13) * 32 + bitRead(telnum, 14) * 64 + bitRead(telnum, 15) * 128;
  309.                 datajia2[2] = bitRead(telnum, 16) + bitRead(telnum, 17) * 2 + bitRead(telnum, 18) * 4 + bitRead(telnum, 19) * 8 + bitRead(telnum, 20) * 16 + bitRead(telnum, 21) * 32 + bitRead(telnum, 22) * 64 + bitRead(telnum, 23) * 128;
  310.                 datajia2[1] = bitRead(telnum, 24) + bitRead(telnum, 25) * 2 + bitRead(telnum, 26) * 4 + bitRead(telnum, 27) * 8 + bitRead(telnum, 28) * 16 + bitRead(telnum, 29) * 32 + bitRead(telnum, 30) * 64 + bitRead(telnum, 31) * 128;
  311.                 datajia2[0] = 0;
  312.                 m = int(datasim[douhao[1] + 2]);
  313.                 switch (m)
  314.                 {
  315.                   case 48:
  316.                     {
  317.                       datajia1[0] = 2; datajia1[1] = 84; datajia1[2] = 11;
  318.                       datajia1[3] = 228; datajia1[4] = 0;
  319.                       break;
  320.                     }
  321.                   case 49: {
  322.                       datajia1[0] = 2; datajia1[1] = 143; datajia1[2] = 166;
  323.                       datajia1[3] = 174; datajia1[4] = 0;
  324.                       break;
  325.                     }
  326.                   case 50: {
  327.                       datajia1[0] = 2; datajia1[1] = 203; datajia1[2] = 65;
  328.                       datajia1[3] = 120; datajia1[4] = 0;
  329.                       break;
  330.                     }
  331.                   case 51: {
  332.                       datajia1[0] = 3; datajia1[1] = 6; datajia1[2] = 220;
  333.                       datajia1[3] = 66; datajia1[4] = 0;
  334.                       break;
  335.                     }
  336.                   case 52: {
  337.                       datajia1[0] = 3; datajia1[1] = 66; datajia1[2] = 119;
  338.                       datajia1[3] = 12; datajia1[4] = 0;
  339.                       break;
  340.                     }
  341.                   case 53: {
  342.                       datajia1[0] = 3; datajia1[1] = 126; datajia1[2] = 17;
  343.                       datajia1[3] = 214; datajia1[4] = 0;
  344.                       break;
  345.                     }
  346.                   case 54: {
  347.                       datajia1[0] = 3; datajia1[1] = 185; datajia1[2] = 172;
  348.                       datajia1[3] = 160; datajia1[4] = 0;
  349.                       break;
  350.                     }
  351.                   case 55: {
  352.                       datajia1[0] = 3; datajia1[1] = 245; datajia1[2] = 71;
  353.                       datajia1[3] = 106; datajia1[4] = 0;
  354.                       break;
  355.                     }
  356.                   case 56: {
  357.                       datajia1[0] = 4; datajia1[1] = 48; datajia1[2] = 226;
  358.                       datajia1[3] = 52; datajia1[4] = 0;
  359.                       break;
  360.                     }
  361.                   case 57: {
  362.                       datajia1[0] = 4; datajia1[1] = 108; datajia1[2] = 124;
  363.                       datajia1[3] = 254; datajia1[4] = 0;
  364.                       break;
  365.                     }
  366.                 }
  367.                 datajia1[4] = datajia2[4];
  368.                 for (n = 3; n > 0; n--)
  369.                 {
  370.                   datajia1[n] = datajia2[n] + datajia1[n] + datajia3[n];
  371.                   if (datajia1[n] > 255)
  372.                   {
  373.                     datajia1[n] = datajia1[n] - 256;
  374.                     datajia3[n - 1] = 1;
  375.                   }
  376.                 }
  377.                 datajia1[0] = datajia1[0] + datajia3[0];
  378.                 EEPROM.write(8, datajia1[0]);
  379.                 delay(10);
  380.                 EEPROM.write(9, datajia1[1]);
  381.                 delay(10);
  382.                 EEPROM.write(10, datajia1[2]);
  383.                 delay(10);
  384.                 EEPROM.write(11, datajia1[3]);
  385.                 delay(10);
  386.                 EEPROM.write(12, datajia1[4]);
  387.                 delay(10);
  388.               }
  389.             }
  390.     }
  391.     datasim = "";

  392.     mark = 0;
  393.   }
  394.   Serial.print("\r\n");
  395. }

  396. void PrintHex(unsigned long a)                                  //将ip从长整型转化为十六进制的8个字符
  397. {
  398.   iphex = "";
  399.   char *Hex = "0123456789ABCDEF";
  400.   if (!a)return;
  401.   PrintHex(a / 16);
  402.   iphex += Hex[a % 16];
  403. }

  404. int hextodec(char a, char b)
  405. {
  406.   int num = 0, c = 0, d = 0;
  407.   if (a < 58)
  408.     c = a - 48;
  409.   else
  410.     c = a - 55;
  411.   if (b < 58)
  412.     d = b - 48;
  413.   else
  414.     d = b - 55;
  415.   num = c * 16 + d;
  416.   return num;
  417. }

  418. void dectostring(int a, int b, int c, int d)                       //将十进制数转化成ip字符串
  419. {

  420.   int ipbit1 = 0, ipbit2 = 0, ipbit3 = 0;
  421.   ip = "";
  422.   ipbit3 = a % 10;
  423.   ipbit2 = ((a - ipbit3) / 10) % 10;
  424.   ipbit1 = (a - ipbit3 - 10 * ipbit2) / 100;
  425.   if (ipbit1 != 0)
  426.     ip += char(ipbit1 + 48);
  427.   ip += char(ipbit2 + 48);
  428.   ip += char(ipbit3 + 48);
  429.   ip += '.';
  430.   ipbit3 = b % 10;
  431.   ipbit2 = ((b - ipbit3) / 10) % 10;
  432.   ipbit1 = (b - ipbit3 - 10 * ipbit2) / 100;
  433.   if (ipbit1 != 0)
  434.     ip += char(ipbit1 + 48);
  435.   ip += char(ipbit2 + 48);
  436.   ip += char(ipbit3 + 48);
  437.   ip += '.';
  438.   ipbit3 = c % 10;
  439.   ipbit2 = ((c - ipbit3) / 10) % 10;
  440.   ipbit1 = (c - ipbit3 - 10 * ipbit2) / 100;
  441.   if (ipbit1 != 0)
  442.     ip += char(ipbit1 + 48);
  443.   ip += char(ipbit2 + 48);
  444.   ip += char(ipbit3 + 48);
  445.   ip += '.';
  446.   ipbit3 = d % 10;
  447.   ipbit2 = ((d - ipbit3) / 10) % 10;
  448.   ipbit1 = (d - ipbit3 - 10 * ipbit2) / 100;
  449.   if (ipbit1 != 0)
  450.     ip += char(ipbit1 + 48);
  451.   ip += char(ipbit2 + 48);
  452.   ip += char(ipbit3 + 48);
  453. }

  454. void xierueeprom()
  455. {
  456.   EEPROM.write(0, ipdec[0]);                   //将四段ip和两字节的端口号写入EEPROM
  457.   delay(10);
  458.   EEPROM.write(1, ipdec[1]);
  459.   delay(10);
  460.   EEPROM.write(2, ipdec[2]);
  461.   delay(10);
  462.   EEPROM.write(3, ipdec[3]);
  463.   delay(10);
  464.   EEPROM.write(4, porteeprom1);
  465.   delay(10);
  466.   EEPROM.write(5, porteeprom2);
  467.   delay(10);
  468.   EEPROM.write(6, sleeptime);                     //向EEPROM写入睡眠时间
  469.   EEPROM.write(7, noisenum);                     //向EEPROM写入噪音的次数
  470. }

  471. int getpmnum()
  472. {
  473.   float ppm = 0;
  474.   //  char s[32];
  475.   float voltage = 0;
  476.   float dustdensity = 0;
  477.   float ppmpercf = 0;
  478.   int i = 0, a = 0, b = 0;
  479.   int delayTime = 280;
  480.   int delayTime2 = 40;
  481.   int dustVal = 0;
  482.   float offTime = 9680;
  483.   for (a = 0; a < 2; a++)
  484.   {
  485.     //  i = i + 1;
  486.     digitalWrite(ledPower, LOW); // power on the LED++++++
  487.     delayMicroseconds(delayTime);
  488.     dustVal = analogRead(dustPin); // read the dust value
  489.     //  ppm = ppm + dustVal;
  490.     delayMicroseconds(delayTime2);
  491.     digitalWrite(ledPower, HIGH); // turn the LED off
  492.     delayMicroseconds(offTime);
  493.     voltage = dustVal  * 0.0049;
  494.     //  voltage = ppm / i * 0.0049;
  495.     dustdensity = 0.17 * voltage - 0.1;
  496.     ppmpercf = (voltage - 0.0256) * 120000;
  497.     if (ppmpercf < 0)
  498.       ppmpercf = 0;
  499.     if (dustdensity < 0 )
  500.       dustdensity = 0;
  501.     if (dustdensity > 0.5)
  502.       dustdensity = 0.5;
  503.     //   dataString = "";
  504.     // dataString += dtostrf(voltage, 9, 4, s);
  505.     // dataString += ",";
  506.     // dataString += dtostrf(dustdensity, 5, 2, s);
  507.     //  dataString += ",";
  508.     //  dataString += dtostrf(ppmpercf, 8, 0, s);
  509.     //  i = 0;
  510.     //  ppm = 0;
  511.     delay(200);
  512.   }
  513.   b = dustdensity * 1000;
  514.   return b;
  515. }

  516. int getnoisenum()
  517. {
  518.   String noise = "";               //噪声字符串
  519.   int a = 0, i = 0, j = 0, k = 0, m = 0;
  520.   int noiseint = 0;              //整型噪声值
  521.   noise = "";
  522.   while (!Serial2.available())
  523.   {
  524.   }
  525.   while (Serial2.available() > 0)
  526.   {

  527.     noise += char(Serial2.read());
  528.     delay(2);
  529.   }
  530.   noiseint = (noise[2] - 48) * 100 + (noise[3] - 48) * 10 + (noise[4] - 48);
  531.   return noiseint;
  532. }

  533. void chushihua()              //初始化,如果EEPROM是255,加参数写入,然后将EEPROM的数据赋给全局变量。
  534. {
  535.   int a = 0, b = 0, port1 = 0, port2 = 0;
  536.   unsigned int c = 0, i = 0;                //端口的整型
  537.   int d = 0, e = 0;
  538.   char f = 0;
  539.   char aa[6];
  540.   a = EEPROM.read(0);
  541.   b = EEPROM.read(1);
  542.   if ((a == 255) && (b == 255))
  543.   {
  544.     EEPROM.write(0, 219);              //初始化的数据,包括ip,Port,休眠时间(30),噪音采集次数(3)
  545.     delay(10);
  546.     EEPROM.write(1, 245);
  547.     delay(10);
  548.     EEPROM.write(2, 68);
  549.     delay(10);
  550.     EEPROM.write(3, 1);
  551.     delay(10);
  552.     EEPROM.write(4, 39);
  553.     delay(10);
  554.     EEPROM.write(5, 15);
  555.     delay(10);
  556.     EEPROM.write(6, 30);                 //休眠时间(30)
  557.     delay(10);
  558.     EEPROM.write(7, 3);                 //噪音采集次数(3)
  559.     delay(10);
  560.   }
  561.   ipdec[0] = EEPROM.read(0);
  562.   ipdec[1] = EEPROM.read(1);
  563.   ipdec[2] = EEPROM.read(2);
  564.   ipdec[3] = EEPROM.read(3);
  565.   dectostring(ipdec[0], ipdec[1], ipdec[2], ipdec[3]);    //将十进制数转化成ip字符串
  566.   porteeprom1 = EEPROM.read(4);
  567.   porteeprom2 = EEPROM.read(5);
  568.   c = porteeprom1 * 256 + porteeprom2;                  //itoa只能取到3万多,所以要把最高位单独列出来
  569.   e = c % 10000;
  570.   d = (c - e) / 10000;
  571.   f = d + 48;
  572.   itoa(e, aa, 10);
  573.   if (d != 0)
  574.     port += f;
  575.   for (i = 0; i < 6; i++)
  576.   {
  577.     if (aa[i] != '\0')
  578.       port += aa[i];
  579.   }
  580.   sleeptime = EEPROM.read(6);
  581.   noisenum = EEPROM.read(7);
  582. }

  583. void package()                                  //将数据组包
  584. {
  585.   int i = 0;
  586.   int j = 0;
  587.   datasend[0] = 11;
  588.   datasend[1] = 1;
  589.   datasend[2] = EEPROM.read(8);
  590.   datasend[3] = EEPROM.read(9);
  591.   datasend[4] = EEPROM.read(10);
  592.   datasend[5] = EEPROM.read(11);
  593.   datasend[6] = EEPROM.read(12);
  594.   datasend[7] = pmh;
  595.   datasend[8] = pml;
  596.   datasend[9] = noise;
  597.   for (i = 0; i < 10; i++)
  598.     j = datasend[i] + j;
  599.   datasend[10] = j ^ 169;
  600. }

  601. void tcplink()                                //与数据中心进行TCP通信传输数据接收配置参数
  602. {
  603.   int i = 0;
  604.   unsigned int c = 0;                //端口的整型
  605.   int d = 0, e = 0;
  606.   char f = 0;
  607.   char aa[6];
  608.   Serial3.print("AT+CIPMODE=1\r\n");
  609.   delay(2000);
  610.   Serial3.print("AT+CIPSTART=");
  611.   Serial3.print('"');
  612.   Serial3.print("TCP");
  613.   Serial3.print('"');
  614.   Serial3.print(',');
  615.   Serial3.print('"');
  616.   Serial3.print(ip);
  617.   Serial3.print('"');
  618.   Serial3.print(',');
  619.   Serial3.print(port);
  620.   Serial3.print("\r\n");
  621.   while (1)
  622.   {
  623.     if (Serial3.find("CONNECT"))
  624.       break;
  625.     delay(10);
  626.   }
  627.   for (i = 0; i < 11; i++)
  628.     Serial3.write(datasend[i]);
  629.   while (1)
  630.   {
  631.     i = 0;
  632.     while (!Serial3.available())
  633.     {
  634.     }
  635.     while (Serial3.available() > 0)
  636.     {
  637.       datarece[i] = Serial3.read();
  638.       i++;
  639.       delay(2);
  640.     }
  641.     //     for (j = 0; j < i; j++)
  642.     //       Serial.println(datarece[j]);
  643.     if (datarece[0] == 2)
  644.     {
  645.       if (datarece[1] == 129)
  646.         for (i = 0; i < 11; i++)
  647.           Serial3.write(datasend[i]);
  648.       if (datarece[1] == 161)
  649.         break;
  650.     }
  651.     if (datarece[0] == 8)
  652.     {
  653.       EEPROM.write(0, datarece[2]);
  654.       delay(10);
  655.       EEPROM.write(1, datarece[3]);
  656.       delay(10);
  657.       EEPROM.write(2, datarece[4]);
  658.       delay(10);
  659.       EEPROM.write(3, datarece[5]);
  660.       delay(10);
  661.       EEPROM.write(4, datarece[6]);
  662.       delay(10);
  663.       EEPROM.write(5, datarece[7]);
  664.       delay(10);
  665.       dectostring(datarece[2], datarece[3], datarece[4], datarece[5]);    //将十进制数转化成ip字符串
  666.       port = "";
  667.       porteeprom1 = datarece[6];
  668.       porteeprom2 = datarece[7];
  669.       c = porteeprom1 * 256 + porteeprom2;                  //itoa只能取到3万多,所以要把最高位单独列出来
  670.       e = c % 10000;
  671.       d = (c - e) / 10000;
  672.       f = d + 48;
  673.       itoa(e, aa, 10);
  674.       if (d != 0)
  675.         port += f;
  676.       for (i = 0; i < 6; i++)
  677.       {
  678.         if (aa[i] != '\0')
  679.           port += aa[i];
  680.       }
  681.       Serial3.write(2);               //配置ip和Port并发出响应
  682.       Serial3.write(162);
  683.       if (datarece[1] == 162)
  684.         break;
  685.     }
  686.     if (datarece[0] == 4)
  687.     {
  688.       EEPROM.write(6, datarece[2]);
  689.       delay(10);
  690.       EEPROM.write(7, datarece[3]);
  691.       delay(10);
  692.       sleeptime = datarece[2];
  693.       noisenum = datarece[3];
  694.       Serial3.write(2);                //配置休眠时间和噪音采集次数并发出响应
  695.       Serial3.write(163);

  696.       if (datarece[1] == 163)
  697.         break;
  698.     }
  699.   }
  700. }

  701. int maxnoise(int a)
  702. {
  703.   unsigned char nn[100] = {0}, b = 0;
  704.   int i = 0;
  705.   for (i = 0; i < a; i++)
  706.   {
  707.     nn[i] = getnoisenum();
  708.     delay(16000);
  709.   }
  710.   for (i = 0; i < a; i++)
  711.   {
  712.     b = max(b, nn[i]);
  713.   }
  714.   return b;
  715. }

  716. void delallsms()                                   //删除所有短信
  717. {
  718.   Serial3.print("AT+CMGDA=");
  719.   Serial3.print('"');
  720.   Serial3.print("DEL ALL");
  721.   Serial3.print('"');
  722.   Serial3.print("\r\n");
  723. }

  724. void sleepmode(int a)                           //进入休眠模式
  725. {
  726.   int i = 0;
  727.   for(i = 0;i < (2*a);i++)
  728.     Narcoleptic.delay(30000);
  729. }

  730. void chulismsip()                               //每隔一段时间读短信,有电话号码就跳出否则一直循环
  731. {
  732.   while (1)
  733.   {
  734.     int a = 0;
  735.     a = EEPROM.read(8);
  736.     if (a == 255)
  737.     {
  738.       duanxinnum = SMSnum();
  739.       if ((duanxinnum > 0) && (duanxinnum < 10))
  740.         chuliduanxin(duanxinnum);
  741.     }
  742.     else
  743.       break;
  744.     a = EEPROM.read(8);
  745.     if (a == 255)
  746.       sleepmode(30);
  747.     else
  748.       break;
  749.   }
  750. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-9-10 19:36:10 | 显示全部楼层
代码有点长,参考一下就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-10 19:39:43 | 显示全部楼层
34行和46到52行屏蔽了,下面的TCP连接就行,恢复短信操作后就不行了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-10 19:43:14 | 显示全部楼层
另外,我单独用串口调试工具操作sim900a,就不存在这个问题,短信操作之后TCP也能连上啊。
回复 支持 反对

使用道具 举报

发表于 2014-9-10 20:36:32 | 显示全部楼层
内存爆了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-12 09:42:37 | 显示全部楼层
不是,全局变量用了10%,程序存储空间用了6%
回复 支持 反对

使用道具 举报

发表于 2014-10-2 20:06:48 | 显示全部楼层
想问一下ardunio uno和sim900a您是怎么连接的用的哪些口
回复 支持 反对

使用道具 举报

发表于 2014-10-2 20:08:58 | 显示全部楼层
'Serial2'was not declared in this scope请问下这个是怎么回事
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-4 15:09:14 | 显示全部楼层
'Serial2只有arduino mega 2560里才有,Uno只有一对串口,mega 2560有4对,你是不是用Uno的,极客工坊的知识库里有。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-4 15:10:06 | 显示全部楼层
你如果想要在Uno用多对串口,可以用软串口库试试。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 22:27 , Processed in 0.060653 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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