两路超声波检测距离,并通过GA6进行数据发送到服务器上
单片机源程序如下:
- /**********************寿工**************************/
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "usart.h"
- #include "usart2.h"
- #include "delay.h"
- #include "hcsr04.h"
- #include "GA6_module_errors.h"
- #include "timer.h"
- #include <stdio.h>
- #include <string.h>
- #define Buf2_Max 100 //串口2缓存长度
- #define STABLE_TIMES 10 //等待系统上电后的稳定
- /************* 本地变量声明 **************/
- char Uart2_Buf[Buf2_Max]; //接收缓冲,最大USART_REC_LEN个字节.
- u16 USART2_RX_STA=0;
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u8 First_Int = 0;
- char error_result[20];
- char server_ip_port_cmd[45];
- /*全局标志变量*/
- u8 object1=0,object2=0,object3=0,object4=0,t=0;
- u8 y1=0,y2=0,y3=0,y4=0;
- extern float HC_SR04_Init(void);
- extern float HC_SR04_Init2(void);
- /************* 本地函数声明 **************/
- void CLR_Buf(void); //清除串口2接收缓存
- u8 Wait_CREG(u8 query_times); //等待模块注册成功
- u8 Find(char *a);
- /*检测状态函数*/
- int check_status(void)
- {
- int ret;
- char esc_char[2];
-
- esc_char[0] = 0x1B;//退出字符
- esc_char[1] = '\0';
-
- ret = UART2_Send_AT_Command("AT","OK",5,50,1);//测试通信是否成功
- if(ret == 0)
- {
- UART2_SendString(esc_char);//万一进入>状态,那么久发送一个ESC字符
- // return COMMUNITE_ERROR;
- }
-
- ret = UART2_Send_AT_Command("AT+CPIN?","+CPIN:READY",2,50,1);//查询卡是否插上
- if(ret == 0)
- {
- // return NO_SIM_CARD_ERROR;
- }
-
- ret = Wait_CREG(3);//查询卡是否注册到网络
- if(ret == 0)
- {
- // return SIM_CARD_NO_REG_ERROR;
- }
-
- return 1;
- }
- /*初始化发送函数*/
- int send_data_to_server2(char *server_IP_and_port,char *content)
- {
- u8 ret;
- char end_char[2];
-
-
- end_char[0] = 0x1A;//结束字符
- end_char[1] = '\0';
-
- check_status();
- ret = UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,5);//附着网络
- if(ret == 0)
- {
- return AT_CGATT_ERROR;
- }
-
- ret = UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,2);//激活网络
- if(ret == 0)
- {
- return AT_CGATT1_ERROR;
- }
- UART2_Send_AT_Command("AT+CIPCLOSE","OK",2,50,3);//关闭链接
- memset(server_ip_port_cmd,'\0',45);
- strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
- strcat(server_ip_port_cmd,server_IP_and_port);
-
- ret = UART2_Send_AT_Command(server_ip_port_cmd,"OK",3,50,2);//连接服务器
- if(ret == 0)
- return AT_CIPSTART_ERROR;
- ret = UART2_Send_AT_Command("AT+CIPSEND",">",2,50,2);//开发发送数据
- if(ret == 0)
- return AT_CIPSEND_ERROR;
-
- UART2_SendString(content);
- UART2_SendString(end_char);
- printf("%s\n",content);
- return 1;
- }
- /*连接到服务器的心跳包程序*/
- int connect_to_server(char *server_IP_and_port)
- {
- if(UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,1));//查询连接状态,成功的话就退出
-
- else
- {
- return AT_CGATT_ERROR; //连接查询2次之后返回没有连接
- }
- if( UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,1) ); //查询连接状态,成功的话就退出
- else
- {
- return AT_CGATT1_ERROR; //连接查询2次之后返回没有连接
- }
- memset(server_ip_port_cmd,'\0',45);
- strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
- strcat(server_ip_port_cmd,server_IP_and_port);
- if( UART2_Send_AT_Command(server_ip_port_cmd,"OK",3,50,2) );//连接服务器,成功的话就退出
- else
- {
- delay_ms(1000);
- return AT_CIPSTART_ERROR; //连接查询2次之后返回没有连接
- }
- return 1;
- }
- /***************************************************************
- 注:当然你可以返回其他值,来确定到底是哪一步发送指令出现失败了。
- ****************************************************************/
- int send_data_to_server(char *server_IP_and_port,char *content)
- {
- u8 ret;
-
- char end_char[2];
-
-
- end_char[0] = 0x1A;//结束字符
- end_char[1] = '\0';
- check_status();
-
- ret = UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,5);//附着网络
- if(ret == 0)
- {
- return AT_CGATT_ERROR;
- }
-
- ret = UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,2);//激活网络
- if(ret == 0)
- {
- return AT_CGATT1_ERROR;
- }
-
- ret = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",1,50,2);//查询连接状态
- if(ret == 1)//说明服务器处于连接状态
- {
- ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50,1);//开发发送数据
- if(ret == 0)
- {
- return AT_CIPSEND_ERROR;
- }
- UART2_SendString(content);
- UART2_SendString(end_char);
- printf("%s\n",content);
-
- return 1;
- }
- else
- {
- memset(server_ip_port_cmd,'\0',45);
- strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
- strcat(server_ip_port_cmd,server_IP_and_port);
-
- ret = UART2_Send_AT_Command(server_ip_port_cmd,"OK",3,50,2);//连接服务器
- if(ret == 0)
- {
- return AT_CIPSTART_ERROR;
- }
- ret = UART2_Send_AT_Command("AT+CIPSEND",">",2,50,2);//开发发送数据
- if(ret == 0)
- {
- return AT_CIPSEND_ERROR;
- }
-
- UART2_SendString(content);
- delay_ms(20);
- UART2_SendString(end_char);
- printf("%s\n",content);
- }
- return 1;
- }
- int ret;
- /*完整的发送函数*/
- void setdata(char *server_IP_and_port,char *content)
- {
-
- while(!send_data_to_server(server_IP_and_port,content));//发送数据到服务器
- printf("成功发送到server\r\n");
- UART1_SendString(error_result);
- delay_ms(1500);
- UART1_SendString("收到回复:\r\n"); //received:后面的内容才是回复的真正内容
- UART1_SendString(Uart2_Buf);
- UART1_SendString("\r\n");
-
- }
- /*初始化发送信息函数*/
- void setdata2(char *server_IP_and_port,char *content)
- {
- while(!send_data_to_server2(server_IP_and_port,content));//发送数据到服务器
-
- printf("成功发送到server\r\n");
- UART1_SendString(error_result);
- delay_ms(500);
- UART1_SendString("收到回复:\r\n"); //received:后面的内容才是回复的真正内容
- UART1_SendString(Uart2_Buf);
- UART1_SendString("\r\n");
-
- }
- //void TIM4_IRQHandler(void) //TIM3中断
- //{
- // static u8 ret=1; //默认连接
- //
- // if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否
- // {
- //
- // TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIM2更新中断标志
- //
- // ret = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",3,50,2);//查询连接状态
- //
- // if(ret==0)
- // {
- // check_status();
- // ret=connect_to_server("\"106.14.153.104\",8080");
- // printf("%d",ret);
- // }
- // }
- //}
- /*心跳包+地锁控制*/
- void receive(void)
- {
- u8 ret1=0,flag=0,check=0,a=0;
- ret1 = Find("+IPD,1:0");
- while(ret1 == 1)
- {
- for(a=0;a<5;a++)
- {
- if(HC_SR04_Init()<10)
- flag++;
- }
- if(flag<2)
- {
- LED0=0;
- delay_ms(500);
- LED0=1;
- }
- flag = 0;
- ret1 = 0;
- }
- ret1 = Find("+IPD,1:1");
- while(ret1 == 1)
- {
- for(a=0;a<5;a++)
- {
- if(HC_SR04_Init2()<10)
- flag++;
- }
- if(flag<2)
- {
- LED1=0;
- delay_ms(500);
- LED1=1;
- }
- flag = 0;
- ret1 = 0;
- }
- check_status();
- UART2_Send_AT_Command("AT+CGATT=1","OK",3,50,5);//附着网络
- UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50,2);//激活网络
- check = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",3,50,2);
- printf("boject=%d",check);
- if(check == 0)
- {
- check_status();
- setdata("\"115.29.169.13\",5000","ID 000035\r\n");
- }
- }
- int main(void)
- {
- u8 i=0;
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- USART2_Init_Config(115200); //串口2初始
- USART1_Init_Config(115200);//UART1用作串口调试信息
- LED_Init(); //LED端口初始化
- GPIO_Config();
- TIM_Config();
- NVIC_Config();
- GPIO_Config2();
- TIM_Config2();
- NVIC_Config2();
- UART1_SendString("系统启动.......................\r\n");
- for(i = 0;i < STABLE_TIMES;i++)
- {
- delay_ms(50);
- printf("%d",i);
- }
- memset(error_result,'\0',20);
- i=0;
- CLR_Buf();
- setdata2("\"115.29.169.13\",5000","ID 000035\r\n");
- while(1)
- {
- while(i<10)
- {
- if(HC_SR04_Init() > 10 && y1 == 0)
- {
- object1++;
- }
- else if(HC_SR04_Init() < 10 && y2 == 0)
- {
- object2++;
- }
- if(HC_SR04_Init2() > 10 && y3 == 0)
- {
- object3++;
- }
- else if(HC_SR04_Init2() < 10 && y4 == 0)
- {
- object4++;
- }
- i++;
- }
- if(object1>5&&object1<11 )
- {
- y1=1;
- CLR_Buf();
- setdata("\"115.29.169.13\",5000","V 10\r\n") ;
- object1+=10;
- }
- else if(object2>5&&object2<11)
- {
- y2=1;
- CLR_Buf();
- setdata("\"115.29.169.13\",5000","V 11\r\n");
- object2+=10;
- }
- if(object3>5&&object3<11 )
- {
- y3=1;
- CLR_Buf();
- setdata("\"115.29.169.13\",5000","V 20\r\n");
- object3+=10;
- }
- else if(object4>5&&object4<11)
- {
- y4=1;
- CLR_Buf();
- setdata("\"115.29.169.13\",5000","V 21\r\n");
- object4+=10;
- }
-
- if(object1 > 7&&object3 > 7)
- {
- for(i=0;i<5;i++)
- {
- if(HC_SR04_Init() < 10 || HC_SR04_Init2() < 10)
- {
- t++;
- }
- }
- if(t > 2)
- {
- y1 = 0;
- y2 = 0;
- y3 = 0;
- y4 = 0;
- object1=0;
- object2=0;
- object3=0;
- object4=0;
- }
- }
- if(object2 > 7&&object3 > 7)
- {
- for(i=0;i<5;i++)
- {
- if(HC_SR04_Init() > 10 || HC_SR04_Init2() < 10)
- {
- t++;
- }
- }
- if(t > 2)
- {
- y1 = 0;
- y2 = 0;
- y3 = 0;
- y4 = 0;
- object1=0;
- object2=0;
- object3=0;
- object4=0;
- }
- }
- if(object1 > 7&&object4 > 7)
- {
- for(i=0;i<5;i++)
- {
- if(HC_SR04_Init() < 10 || HC_SR04_Init2() > 10)
- {
- t++;
- }
- }
- if(t > 2)
- {
- y1 = 0;
- y2 = 0;
- y3 = 0;
- y4 = 0;
- object1=0;
- object2=0;
- object3=0;
- object4=0;
- }
- }
- if(object2 > 7&&object4 > 7)
- {
- for(i=0;i<5;i++)
- {
- if(HC_SR04_Init() > 10 || HC_SR04_Init2() > 10)
- {
- t++;
- }
- }
- if(t > 2)
- {
- y1 = 0;
- y2 = 0;
- y3 = 0;
- y4 = 0;
- object1=0;
- object2=0;
- object3=0;
- object4=0;
- }
- }
- i=0;
- t=0;
- receive();
- }
- }
- void USART2_IRQHandler(void)
- {
- u8 Res=0;
- Res = USART_ReceiveData(USART2);
- Uart2_Buf[First_Int] = Res; //将接收到的字符串存到缓存中
- First_Int++; //缓存指针向后移动
- if(First_Int > Buf2_Max) //如果缓存满,将缓存指针指向缓存的首地址
- {
- First_Int = 0;
- }
- }
- /************************************************************************
- * 函数名 : TIM2_IRQHandler
- * 描述 : 定时器2中断断服务函数
- * 输入 : 无
- * 输出 : 无
- * 返回 : 无
- * 说明 : 无
- *******************************************************************************/
- /*******************************************************************************
- * 函数名 : CLR_Buf
- * 描述 : 清除串口2缓存数据
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf(void)
- {
- u16 k;
- for(k=0;k<Buf2_Max;k++) //将缓存内容清零
- {
- Uart2_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存储位置
- }
- /*******************************************************************************
- * 函数名 : Wait_CREG
- * 描述 : 等待模块注册成功
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- u8 Wait_CREG(u8 query_times)
- {
- u8 i;
- u8 k;
- u8 j;
- i = 0;
- CLR_Buf();
- while(i == 0)
- {
- UART2_Send_Command("AT+CREG?");
- delay_ms(1000);
- delay_ms(1000);
-
- for(k=0;k<Buf2_Max;k++)
- {
- 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] == ':'))
- {
-
- if((Uart2_Buf[k+7] == '1')&&((Uart2_Buf[k+9] == '1')||(Uart2_Buf[k+9] == '5')))
- {
- i = 1;
- return 1;
- }
-
- }
- }
- j++;
- if(j > query_times)
- {
- return 0;
- }
-
- }
- return 0;
- }
- /*******************************************************************************
- * 函数名 : Find
- * 描述 : 判断缓存中是否含有指定的字符串
- * 输入 :
- * 输出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(char *a)
- {
- if(strstr(Uart2_Buf, a)!=NULL)
- {
- return 1;
- }
- else
- {
- return 0;
- }
-
- }
- u8 UART2_Send_AT_Command(char *b,char *a,u8 wait_time,u32 interval_time,u8 ji)
- {
- u8 i,j,m;
- u8 flag=0;
- i = 0;
- while(i < wait_time) //如果没有找到 就继续再发一次指令 再进行查找目标字符串
- {
- UART2_Send_Command(b);//串口2发送 b 字符串 他会自动发送\r\n 相当于发送了一个指令
- for(j=0;j<ji;j++)
- delay_ms_ken(interval_time*20); //等待一定时间 传50的话就是 50*20ms = 1秒
- if(Find("+IPD,1:0"))
- {
- for(m=0;m<5;m++)
- {
- if(HC_SR04_Init()<10)
- flag++;
- }
- if(flag<2)
- {
- LED0=0;
- delay_ms(500);
- LED0=1;
- }
- flag=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
项目三咪表OK.rar
(312.23 KB, 下载次数: 32)
|