标题:
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://www.51hei.com/bbs/)
Powered by Discuz! X3.1