兩路超聲波檢測距離,并通過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)
2018-5-13 17:25 上傳
點擊文件名下載附件
GA6網絡模塊的TCP發送方式+兩路超聲波檢測實現 下載積分: 黑幣 -5
|