找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2603|回复: 0
打印 上一主题 下一主题
收起左侧

STM32咪表设计源码 GA6网络模块的TCP发送方式+两路超声波检测实现

[复制链接]
跳转到指定楼层
楼主
ID:328938 发表于 2018-5-13 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   两路超声波检测距离,并通过GA6进行数据发送到服务器上

单片机源程序如下:
  1. /**********************寿工**************************/
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "key.h"
  5. #include "sys.h"
  6. #include "usart.h"
  7. #include "usart2.h"
  8. #include "delay.h"
  9. #include "hcsr04.h"
  10. #include "GA6_module_errors.h"
  11. #include "timer.h"
  12. #include <stdio.h>
  13. #include <string.h>

  14. #define Buf2_Max           100 //串口2缓存长度
  15. #define STABLE_TIMES  10  //等待系统上电后的稳定

  16. /*************  本地变量声明        **************/
  17. char Uart2_Buf[Buf2_Max];     //接收缓冲,最大USART_REC_LEN个字节.
  18. u16 USART2_RX_STA=0;
  19. //接收状态
  20. //bit15,        接收完成标志
  21. //bit14,        接收到0x0d
  22. //bit13~0,        接收到的有效字节数目
  23. u8 First_Int = 0;  
  24. char error_result[20];
  25. char server_ip_port_cmd[45];

  26. /*全局标志变量*/
  27. u8 object1=0,object2=0,object3=0,object4=0,t=0;
  28. u8 y1=0,y2=0,y3=0,y4=0;
  29. extern float HC_SR04_Init(void);
  30. extern float HC_SR04_Init2(void);


  31. /*************        本地函数声明        **************/
  32. void CLR_Buf(void);     //清除串口2接收缓存
  33. u8 Wait_CREG(u8 query_times);    //等待模块注册成功
  34. u8 Find(char *a);

  35. /*检测状态函数*/
  36. int check_status(void)
  37. {
  38.         int ret;
  39.         char esc_char[2];
  40.        
  41.         esc_char[0] = 0x1B;//退出字符
  42.         esc_char[1] = '\0';
  43.        
  44.         ret = UART2_Send_AT_Command("AT","OK",5,50,1);//测试通信是否成功
  45.         if(ret == 0)
  46.         {
  47.                 UART2_SendString(esc_char);//万一进入>状态,那么久发送一个ESC字符
  48. //                return COMMUNITE_ERROR;
  49.         }
  50.        
  51.         ret = UART2_Send_AT_Command("AT+CPIN?","+CPIN:READY",2,50,1);//查询卡是否插上
  52.         if(ret == 0)
  53.         {
  54. //                return NO_SIM_CARD_ERROR;
  55.         }
  56.        
  57.         ret = Wait_CREG(3);//查询卡是否注册到网络
  58.         if(ret == 0)
  59.         {
  60. //                return SIM_CARD_NO_REG_ERROR;
  61.         }
  62.    
  63.         return 1;
  64. }




  65. /*初始化发送函数*/
  66. int send_data_to_server2(char *server_IP_and_port,char *content)
  67. {
  68.         u8 ret;       
  69.         char end_char[2];
  70.        
  71.        
  72.         end_char[0] = 0x1A;//结束字符
  73.         end_char[1] = '\0';
  74.        
  75.         check_status();
  76.         ret = UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,5);//附着网络
  77.         if(ret == 0)
  78.         {
  79.                 return AT_CGATT_ERROR;
  80.         }
  81.        
  82.         ret = UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,2);//激活网络
  83.         if(ret == 0)
  84.         {
  85.                 return AT_CGATT1_ERROR;
  86.         }
  87.         UART2_Send_AT_Command("AT+CIPCLOSE","OK",2,50,3);//关闭链接
  88.         memset(server_ip_port_cmd,'\0',45);
  89.         strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
  90.         strcat(server_ip_port_cmd,server_IP_and_port);
  91.        
  92.         ret = UART2_Send_AT_Command(server_ip_port_cmd,"OK",3,50,2);//连接服务器
  93.         if(ret == 0)
  94.                 return AT_CIPSTART_ERROR;
  95.         ret = UART2_Send_AT_Command("AT+CIPSEND",">",2,50,2);//开发发送数据
  96.         if(ret == 0)
  97.                 return AT_CIPSEND_ERROR;
  98.        
  99.         UART2_SendString(content);
  100.         UART2_SendString(end_char);
  101.         printf("%s\n",content);       
  102.         return 1;
  103. }


  104. /*连接到服务器的心跳包程序*/

  105. int connect_to_server(char *server_IP_and_port)
  106. {
  107.                         if(UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,1));//查询连接状态,成功的话就退出
  108.                        
  109.                         else   
  110.                         {                               
  111.                                 return AT_CGATT_ERROR;                                                     //连接查询2次之后返回没有连接                       
  112.                         }

  113.                         if(        UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,1) );           //查询连接状态,成功的话就退出               
  114.                         else   
  115.                         {                       
  116.                     return AT_CGATT1_ERROR;                                                //连接查询2次之后返回没有连接                       
  117.                         }
  118.                         memset(server_ip_port_cmd,'\0',45);
  119.                         strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
  120.                         strcat(server_ip_port_cmd,server_IP_and_port);
  121.                         if( UART2_Send_AT_Command(server_ip_port_cmd,"OK",3,50,2) );//连接服务器,成功的话就退出       
  122.                         else   
  123.                         {                               
  124.                                 delay_ms(1000);
  125.                     return AT_CIPSTART_ERROR;                                                //连接查询2次之后返回没有连接                       
  126.                         }
  127.         return 1;
  128. }

  129. /***************************************************************
  130. 注:当然你可以返回其他值,来确定到底是哪一步发送指令出现失败了。
  131. ****************************************************************/
  132. int send_data_to_server(char *server_IP_and_port,char *content)
  133. {
  134.         u8 ret;       
  135.        
  136.         char end_char[2];
  137.        
  138.        
  139.         end_char[0] = 0x1A;//结束字符
  140.         end_char[1] = '\0';
  141.         check_status();
  142.        
  143.         ret = UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,5);//附着网络
  144.         if(ret == 0)
  145.         {
  146.                 return AT_CGATT_ERROR;
  147.         }
  148.        
  149.         ret = UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,2);//激活网络
  150.         if(ret == 0)
  151.         {
  152.                 return AT_CGATT1_ERROR;
  153.         }
  154.        
  155.         ret = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",1,50,2);//查询连接状态
  156.         if(ret == 1)//说明服务器处于连接状态
  157.         {
  158.                 ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50,1);//开发发送数据
  159.                 if(ret == 0)
  160.                 {
  161.                         return AT_CIPSEND_ERROR;
  162.                 }
  163.                 UART2_SendString(content);
  164.                 UART2_SendString(end_char);
  165.                 printf("%s\n",content);
  166.                
  167.                 return 1;
  168.         }               
  169.         else
  170.                 {
  171.                                         memset(server_ip_port_cmd,'\0',45);
  172.                                 strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
  173.                                 strcat(server_ip_port_cmd,server_IP_and_port);
  174.                                
  175.                                 ret = UART2_Send_AT_Command(server_ip_port_cmd,"OK",3,50,2);//连接服务器
  176.                                 if(ret == 0)
  177.                                 {
  178.                                         return AT_CIPSTART_ERROR;
  179.                                 }
  180.                                 ret = UART2_Send_AT_Command("AT+CIPSEND",">",2,50,2);//开发发送数据
  181.                                 if(ret == 0)
  182.                                 {
  183.                                         return AT_CIPSEND_ERROR;
  184.                                 }
  185.                                
  186.                                 UART2_SendString(content);
  187.                                 delay_ms(20);
  188.                                 UART2_SendString(end_char);
  189.                                 printf("%s\n",content);
  190.                 }
  191.         return 1;
  192. }
  193. int  ret;
  194. /*完整的发送函数*/
  195. void setdata(char *server_IP_and_port,char *content)
  196. {
  197.        
  198.         while(!send_data_to_server(server_IP_and_port,content));//发送数据到服务器                                       

  199.                 printf("成功发送到server\r\n");
  200.                 UART1_SendString(error_result);
  201.                 delay_ms(1500);
  202.                 UART1_SendString("收到回复:\r\n");  //received:后面的内容才是回复的真正内容
  203.                 UART1_SendString(Uart2_Buf);
  204.                 UART1_SendString("\r\n");
  205.                                
  206. }


  207. /*初始化发送信息函数*/
  208. void setdata2(char *server_IP_and_port,char *content)
  209. {

  210.         while(!send_data_to_server2(server_IP_and_port,content));//发送数据到服务器                                       
  211.        
  212.                 printf("成功发送到server\r\n");
  213.                 UART1_SendString(error_result);
  214.                 delay_ms(500);
  215.                 UART1_SendString("收到回复:\r\n");  //received:后面的内容才是回复的真正内容
  216.                 UART1_SendString(Uart2_Buf);
  217.                 UART1_SendString("\r\n");
  218.                                        
  219. }



  220. //void TIM4_IRQHandler(void)   //TIM3中断
  221. //{
  222. //        static u8 ret=1;                                     //默认连接
  223. //       
  224. //        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
  225. //        {
  226. //               
  227. //                TIM_ClearITPendingBit(TIM4, TIM_IT_Update);  //清除TIM2更新中断标志
  228. //               
  229. //            ret = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",3,50,2);//查询连接状态
  230. //               
  231. //                if(ret==0)
  232. //                        {
  233. //                          check_status();
  234. //                          ret=connect_to_server("\"106.14.153.104\",8080");
  235. //                                printf("%d",ret);
  236. //                        }
  237. //        }       
  238. //}

  239. /*心跳包+地锁控制*/
  240. void receive(void)
  241. {
  242.         u8 ret1=0,flag=0,check=0,a=0;
  243.         ret1 = Find("+IPD,1:0");
  244.         while(ret1 == 1)
  245.         {
  246.                 for(a=0;a<5;a++)
  247.                 {
  248.                         if(HC_SR04_Init()<10)
  249.                                 flag++;
  250.                 }
  251.                 if(flag<2)
  252.                 {
  253.                         LED0=0;
  254.                         delay_ms(500);
  255.                         LED0=1;
  256.                 }
  257.                 flag = 0;
  258.                 ret1 = 0;
  259.         }               
  260.         ret1 = Find("+IPD,1:1");
  261.         while(ret1 == 1)
  262.         {
  263.                 for(a=0;a<5;a++)
  264.                 {
  265.                         if(HC_SR04_Init2()<10)
  266.                                 flag++;
  267.                 }
  268.                 if(flag<2)
  269.                 {
  270.                 LED1=0;
  271.                 delay_ms(500);
  272.                 LED1=1;
  273.                 }
  274.                 flag = 0;
  275.                 ret1 = 0;
  276.         }               
  277.         check_status();
  278.         UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,5);//附着网络
  279.         UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,2);//激活网络
  280.         check = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",3,50,2);
  281.         printf("boject=%d",check);
  282.         if(check == 0)
  283.         {
  284.                 check_status();
  285.                 setdata("\"115.29.169.13\",5000","ID 000035\r\n");
  286.         }
  287. }



  288. int main(void)
  289. {
  290.         u8  i=0;        
  291.         delay_init();                     //延时函数初始化          
  292.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  293.         USART2_Init_Config(115200);  //串口2初始
  294.         USART1_Init_Config(115200);//UART1用作串口调试信息
  295.         LED_Init();                             //LED端口初始化
  296.         GPIO_Config();
  297.         TIM_Config();
  298.         NVIC_Config();
  299.         GPIO_Config2();
  300.         TIM_Config2();
  301.         NVIC_Config2();
  302.         UART1_SendString("系统启动.......................\r\n");
  303.         for(i = 0;i < STABLE_TIMES;i++)
  304.         {
  305.                 delay_ms(50);
  306.                 printf("%d",i);
  307.         }
  308.         memset(error_result,'\0',20);
  309.         i=0;
  310.         CLR_Buf();
  311.         setdata2("\"115.29.169.13\",5000","ID 000035\r\n");       
  312.         while(1)
  313.         {
  314.                 while(i<10)
  315.                 {
  316.                         if(HC_SR04_Init() > 10 && y1 == 0)  
  317.                         {
  318.                                 object1++;
  319.                         }
  320.                                 else if(HC_SR04_Init() < 10 && y2 == 0)  
  321.                         {
  322.                                 object2++;
  323.                         }
  324.                                 if(HC_SR04_Init2() > 10 && y3 == 0)
  325.                         {
  326.                                 object3++;
  327.                         }
  328.                                 else if(HC_SR04_Init2() < 10 && y4 == 0)
  329.                         {
  330.                                 object4++;       
  331.                         }                       
  332.                         i++;
  333.                 }                       
  334.                                                 if(object1>5&&object1<11 )
  335.                                                 {
  336.                                                         y1=1;                                                                               
  337.                                                         CLR_Buf();
  338.                                                         setdata("\"115.29.169.13\",5000","V 10\r\n") ;                               
  339.                                                         object1+=10;
  340.                                                 }
  341.                                                 else if(object2>5&&object2<11)
  342.                                                 {
  343.                                                                 y2=1;
  344.                                                                 CLR_Buf();
  345.                                                                 setdata("\"115.29.169.13\",5000","V 11\r\n");                                                               
  346.                                                                 object2+=10;
  347.                                                 }
  348.                                                 if(object3>5&&object3<11 )
  349.                                                 {
  350.                                                         y3=1;
  351.                                                         CLR_Buf();
  352.                                                         setdata("\"115.29.169.13\",5000","V 20\r\n");                                                               
  353.                                                         object3+=10;
  354.                                                 }
  355.                                                 else if(object4>5&&object4<11)
  356.                                                 {
  357.                                                         y4=1;
  358.                                                         CLR_Buf();
  359.                                                         setdata("\"115.29.169.13\",5000","V 21\r\n");                                               
  360.                                                         object4+=10;
  361.                                                 }               
  362.                                                
  363.                         if(object1 > 7&&object3 > 7)
  364.                         {
  365.                                 for(i=0;i<5;i++)
  366.                                 {
  367.                                         if(HC_SR04_Init() < 10 || HC_SR04_Init2() < 10)
  368.                                         {       
  369.                                                 t++;
  370.                                         }
  371.                                 }
  372.                                 if(t > 2)
  373.                                 {
  374.                                         y1 = 0;
  375.                                         y2 = 0;
  376.                                         y3 = 0;
  377.                                         y4 = 0;
  378.                                         object1=0;
  379.                                         object2=0;
  380.                                         object3=0;
  381.                                         object4=0;
  382.                                 }
  383.                         }
  384.                         if(object2 > 7&&object3 > 7)
  385.                         {
  386.                                 for(i=0;i<5;i++)
  387.                                 {
  388.                                         if(HC_SR04_Init() > 10 || HC_SR04_Init2() < 10)
  389.                                         {       
  390.                                                 t++;
  391.                                         }
  392.                                 }
  393.                                 if(t > 2)
  394.                                 {
  395.                                         y1 = 0;
  396.                                         y2 = 0;
  397.                                         y3 = 0;
  398.                                         y4 = 0;
  399.                                         object1=0;
  400.                                         object2=0;
  401.                                         object3=0;
  402.                                         object4=0;
  403.                                 }
  404.                         }
  405.                         if(object1 > 7&&object4 > 7)
  406.                         {
  407.                                 for(i=0;i<5;i++)
  408.                                 {
  409.                                         if(HC_SR04_Init() < 10 || HC_SR04_Init2() > 10)
  410.                                         {       
  411.                                                 t++;
  412.                                         }
  413.                                 }
  414.                                 if(t > 2)
  415.                                 {
  416.                                         y1 = 0;
  417.                                         y2 = 0;
  418.                                         y3 = 0;
  419.                                         y4 = 0;
  420.                                         object1=0;
  421.                                         object2=0;
  422.                                         object3=0;
  423.                                         object4=0;
  424.                                 }
  425.                         }
  426.                         if(object2 > 7&&object4 > 7)
  427.                         {
  428.                                 for(i=0;i<5;i++)
  429.                                 {
  430.                                         if(HC_SR04_Init() > 10 || HC_SR04_Init2() > 10)
  431.                                         {       
  432.                                                 t++;
  433.                                         }
  434.                                 }
  435.                                 if(t > 2)
  436.                                 {
  437.                                         y1 = 0;
  438.                                         y2 = 0;
  439.                                         y3 = 0;
  440.                                         y4 = 0;
  441.                                         object1=0;
  442.                                         object2=0;
  443.                                         object3=0;
  444.                                         object4=0;               
  445.                                 }
  446.                         }       
  447.                         i=0;
  448.                         t=0;
  449.                         receive();
  450.         }
  451. }



  452. void USART2_IRQHandler(void)                       
  453. {
  454.         u8 Res=0;
  455.         Res = USART_ReceiveData(USART2);
  456.         Uart2_Buf[First_Int] = Res;            //将接收到的字符串存到缓存中
  457.         First_Int++;                          //缓存指针向后移动
  458.         if(First_Int > Buf2_Max)                 //如果缓存满,将缓存指针指向缓存的首地址
  459.         {
  460.                 First_Int = 0;
  461.         }
  462. }        
  463. /************************************************************************
  464. * 函数名  : TIM2_IRQHandler
  465. * 描述    : 定时器2中断断服务函数
  466. * 输入    : 无
  467. * 输出    : 无
  468. * 返回    : 无
  469. * 说明    : 无
  470. *******************************************************************************/

  471. /*******************************************************************************
  472. * 函数名 : CLR_Buf
  473. * 描述   : 清除串口2缓存数据
  474. * 输入   :
  475. * 输出   :
  476. * 返回   :
  477. * 注意   :
  478. *******************************************************************************/
  479. void CLR_Buf(void)
  480. {
  481.         u16 k;
  482.         for(k=0;k<Buf2_Max;k++)      //将缓存内容清零
  483.         {
  484.                 Uart2_Buf[k] = 0x00;
  485.         }
  486.     First_Int = 0;              //接收字符串的起始存储位置
  487. }

  488. /*******************************************************************************
  489. * 函数名 : Wait_CREG
  490. * 描述   : 等待模块注册成功
  491. * 输入   :
  492. * 输出   :
  493. * 返回   :
  494. * 注意   :
  495. *******************************************************************************/
  496. u8 Wait_CREG(u8 query_times)
  497. {
  498.         u8 i;
  499.         u8 k;
  500.         u8 j;
  501.         i = 0;
  502.         CLR_Buf();
  503.         while(i == 0)                               
  504.         {

  505.                 UART2_Send_Command("AT+CREG?");
  506.                 delay_ms(1000);
  507.                 delay_ms(1000);
  508.                
  509.                 for(k=0;k<Buf2_Max;k++)                             
  510.                 {
  511.                         if((Uart2_Buf[k] == '+')&&(Uart2_Buf[k+1] == 'C')&&(Uart2_Buf[k+2] == 'R')&&(Uart2_Buf[k+3] == 'E')&&(Uart2_Buf[k+4] == 'G')&&(Uart2_Buf[k+5] == ':'))
  512.                         {
  513.                                          
  514.                                 if((Uart2_Buf[k+7] == '1')&&((Uart2_Buf[k+9] == '1')||(Uart2_Buf[k+9] == '5')))
  515.                                 {
  516.                                         i = 1;
  517.                                         return 1;
  518.                                 }
  519.                                
  520.                         }
  521.                 }
  522.                 j++;
  523.                 if(j > query_times)
  524.                 {
  525.                         return 0;
  526.                 }
  527.                
  528.         }
  529.         return 0;
  530. }

  531. /*******************************************************************************
  532. * 函数名 : Find
  533. * 描述   : 判断缓存中是否含有指定的字符串
  534. * 输入   :
  535. * 输出   :
  536. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  537. * 注意   :
  538. *******************************************************************************/

  539. u8 Find(char *a)
  540. {
  541.         if(strstr(Uart2_Buf, a)!=NULL)
  542.         {
  543.                 return 1;
  544.         }       
  545.         else
  546.         {
  547.                 return 0;
  548.         }
  549.                
  550. }

  551. u8 UART2_Send_AT_Command(char *b,char *a,u8 wait_time,u32 interval_time,u8 ji)         
  552. {
  553.         u8 i,j,m;
  554.         u8 flag=0;
  555.         i = 0;
  556.         while(i < wait_time)    //如果没有找到 就继续再发一次指令 再进行查找目标字符串               
  557.         {
  558.                 UART2_Send_Command(b);//串口2发送 b 字符串 他会自动发送\r\n  相当于发送了一个指令
  559.                 for(j=0;j<ji;j++)
  560.                 delay_ms_ken(interval_time*20); //等待一定时间 传50的话就是 50*20ms = 1秒
  561.         if(Find("+IPD,1:0"))
  562.         {
  563.                 for(m=0;m<5;m++)
  564.                 {
  565.                         if(HC_SR04_Init()<10)
  566.                                 flag++;
  567.                 }
  568.                 if(flag<2)
  569.                 {
  570.                         LED0=0;
  571.                         delay_ms(500);
  572.                         LED0=1;
  573.                 }
  574.                 flag=0;

  575. ……………………

  576. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
项目三咪表OK.rar (312.23 KB, 下载次数: 32)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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