久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32咪表設計源碼 GA6網絡模塊的TCP發送方式+兩路超聲波檢測實現
[打印本頁]
作者:
shareline
時間:
2018-5-13 16:21
標題:
STM32咪表設計源碼 GA6網絡模塊的TCP發送方式+兩路超聲波檢測實現
兩路超聲波檢測距離,并通過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
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产二三区
|
亚洲国产精品成人无久久精品
|
午夜av免费
|
青娱乐av
|
国产一区二区网站
|
秋霞一区二区三区
|
日韩视频免费看
|
日韩免费在线播放
|
99久久久精品
|
伊人亚洲
|
国产成人在线免费观看
|
成年人网站在线免费观看
|
成人午夜毛片
|
国产日韩欧美一区
|
国产一区二区三区在线
|
精品国产精品三级精品av网址
|
久久免费看片
|
欧美日韩一区二区三区视频
|
国产精品免费一区二区
|
成人免费毛片aaaaaa片
|
成人毛片在线播放
|
成人一级黄色片
|
久久精品99久久久久久
|
欧美黑人一区二区三区
|
三级黄网站
|
午夜在线观看视频网站
|
午夜小视频在线观看
|
深夜福利视频网站
|
特黄毛片
|
91网站在线看
|
国产黄色精品视频
|
国产精品一区二区三区免费
|
亚洲精品1
|
中文字幕av一区
|
日日夜夜综合网
|
国产在线h
|
亚洲精品影院
|
色综合久久天天综合网
|
青草在线视频
|
日韩亚洲欧美在线
|
国产成人午夜
|