蓝牙与WiFi

蓝牙

透传

HAL_UART_Receive_IT(&huart2, (uint8_t*) &USART2_NewData, 1); //开启串口2接收中断
	RS485orBT = 0;//RS485orBT标志位为1时是RS485模式,为0时是蓝牙模块
if (USART2_RX_STA != 0) { //	串口2判断中断接收标志位[处理从蓝牙外部设备接收的字符]
					BUZZER_SOLO1(); //蜂鸣器发声[HAL库精准延时函数]
					BT_printf("%c", USART2_RX_BUF[0]); //蓝牙发送,仅限一个字符发送
					USART2_RX_STA = 0; //清除标志位,准备下一次接收
				}
				if (KEY_1()) {
					BUZZER_SOLO2();//提示音
					BT_printf("A");//向蓝牙发送A
				}
				if (KEY_2()) {
					BUZZER_SOLO2();
					BT_printf("B");
				}
if (KEY_1()) {
		BUZZER_SOLO1();
		LED_1(0);
		LED_2(0);
		BT_printf("AT+NAMECC2541"); //AT指令【修改模块的广播名CC2541】
	}
	if (KEY_2()) {
		BUZZER_SOLO2();
		LED_1(0);
		LED_2(0);
		BT_printf("AT+DISC"); //AT指令【断开手机连接】
	}

蓝牙APP控制

if (USART2_RX_STA & 0x8000) { //判断中断接收标志位(蓝牙模块BT,使用USART2)
			if ((USART2_RX_STA & 0x7FFF) == 3  	//判断接收数量3个
			&& USART2_RX_BUF[0] == '+' 	//判断接收第1个字符是不是+
			&& USART2_RX_BUF[1] == 'O' 	//判断接收第2个字符是不是O
			&& USART2_RX_BUF[2] == 'K')	//判断接收第3个字符是不是K
					{
				LED_1(1);	//LED1控制 //LED1亮,表示接收到+OK(成功)的回复
			} else if ((USART2_RX_STA & 0x7FFF) == 4	//判断接收数量4个
			&& USART2_RX_BUF[0] == '+'		//判断接收第1个字符是不是+
			&& USART2_RX_BUF[1] == 'E'		//判断接收第2个字符是不是E
			&& USART2_RX_BUF[2] == 'R'		//判断接收第3个字符是不是R
			&& USART2_RX_BUF[3] == 'R')		//判断接收第4个字符是不是R
					{
				LED_2(1);		//LED2控制	//LED2亮,表示接收到+ERR(失败)的回复
			} else if ((USART2_RX_STA & 0x7FFF) == 1)	//判断接收数量1个(手机控制程序)
					{
				switch (USART2_RX_BUF[0]) {	//判断接收数据的内容
				case 0x41:
					RELAY_1(1);	继电器的控制程序(0继电器放开,1继电器吸合)
					BT_printf("Relay ON");	//返回数据内容,在手机APP上显示
					break;
				case 0x44:
					RELAY_1(0);	继电器的控制程序(0继电器放开,1继电器吸合)
					BT_printf("Relay OFF");	//返回数据内容,在手机APP上显示
					break;
				case 0x42:
					LED_1(1);	//LED1控制
					BT_printf("LED1 ON");	//返回数据内容,在手机APP上显示
					break;
				case 0x45:
					LED_1(0);	//LED1控制
					BT_printf("LED1 OFF");	//返回数据内容,在手机APP上显示
					break;
				case 0x47:
					BUZZER_SOLO1();	//蜂鸣器输出单音的报警音
					BT_printf("BEEP1");	//返回数据内容,在手机APP上显示
					break;
				case 0x43:
					BUZZER_SOLO2();	//蜂鸣器输出单音的报警音
					BT_printf("BEEP2");	//返回数据内容,在手机APP上显示
					break;
				case 0x46:
					BT_printf("CPU Reset");	//返回数据内容,在手机APP上显示
					HAL_Delay(1000);	//延时
					NVIC_SystemReset();	//系统软件复位函数
					break;
				default:
					//冗余语句
					break;
				}
			}
			USART2_RX_STA = 0;	//标志位清0,准备下次接收
		}
		if (KEY_1())	//按下KEY1判断
		{
			BUZZER_SOLO2();	//提示音
			LED_1(0);	//LED1控制 //在蓝牙模块回复之前先将LED状态复位
			LED_2(0);	//LED2控制
			BT_printf("AT+NAMECC2541");	//向蓝牙模块发送AT指令(修改模块的广播名为CC2541)
		}
		if (KEY_2())	//按下KEY2判断
		{
			BUZZER_SOLO2();	//提示音
			LED_1(0);	//LED1控制 //在蓝牙模块回复之前先将LED状态复位
			LED_2(0);	//LED2控制
			BT_printf("AT+DISC");	//向蓝牙模块发送AT指令(断开与手机的连接)
		}

专业调试

uint8_t buf[7] = {0xA5,0x00,0x01,0x3B,0x00,0xFF,0x5A};//创建要发送和数组
改USART2中的结束符
if (USART2_RX_STA&0x8000){//判断中断接收标志位(蓝牙,使用USART2)
	if ((USART2_RX_STA&0x7FFF) == 6//判断接收数量6个
			&& USART2_RX_BUF[0] == 0xA5//判断第一个数据是不是包头0xA5
			&& USART2_RX_BUF[5] ==//判断接收第6个校验码是不是前四个数据之和
			(USART2_RX_BUF[1]+USART2_RX_BUF[2]+USART2_RX_BUF[3]+USART2_RX_BUF[4]%0x100))
	{
		if (USART2_RX_BUF[1]&0x01)//判断逻辑值中最低位是1则点亮LED
		{
			LED_1(1);
		}else{//0则熄灭
			LED_1(0);
		}
	}
	USART2_RX_STA = 0;
}
if (KEY_1()){
	BUZZER_SOLO2();
	buf[1] = 0x01;//可在计算校验码之前按实现需求修改数据值
	buf[5] = (buf[1]+buf[2]+buf[3]+buf[4]%0x100);//数据相加得出校验码,取最低8位
	HAL_UART_Transmit (&huart2,(uint8_t *)&buf,7,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
}
if (KEY_2()){
	BUZZER_SOLO2();
	buf[1] = 0x00;
	buf[5] = (buf[1]+buf[2]+buf[3]+buf[4]%0x100);
	HAL_UART_Transmit (&huart2,(uint8_t *)&buf,7,0xffff);
}

WIFI 控制ESP8266

首先用AT指令集连接WiFi后再用此程序

(此步要用USART1与USART3连接,进行串口通信才可以发送AT指令)

CUBE MX配置

USART3为异步模式(Asynchronous)

使能NVIC

	HAL_UART_Receive_IT(&huart3, (uint8_t*) &USART3_NewData, 1); //开启USART3接收中断
	USART3_RX_STA = 0; //标志位清0,准备下一次接收
	LED_1(0); //LED复位
	LED_2(0);

控制

AT+RST复位

AT+CWMODE=1 Station模式(3 AP+Station模式)[AP可开热点]

AT+CWLAP 扫描热点

AT+CWJAP_DEF=“A”,"0.123456789"接入热点

AT+CIPSEND=5 //5为数据数量【等>后,再发送数据】

AT+CIPCLOSED 与电脑服务器端的TCP连接断开

AT+CWQAP 断开与路由器连接

AT+CWSAP_DEF=“ESP8266”,"1234567890"11,2

AT+CIPMUX=1 多连接模式

AT+CIPSERVER=1,1001 开启服务器,端口号1001

AT+CIFSR 查询本机IP地址

while(1)中:

连接TCP的时候,IP与端口需自行正确配置

//TCP接收数据的处理
		//只有串口3接收到开头为“+IPD,“时才被识别为接收到数据,数据内容在USART3_RX_STA&0x3FFF。
		if (USART3_RX_STA & 0x8000)		      //判断中断接收标志位(WIFI模块使用USART3)
				{
			switch (USART3_RX_STA & 0x3FFF)		      //判断接收数据的内容
			{
			case 'A':
				RELAY_1(1);		      继电器的控制程序(0继电器放开,1继电器吸合)
				WIFI_TCP_SEND("Relay ON:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			case 'B':
				RELAY_1(0);		      继电器的控制程序(0继电器放开,1继电器吸合)
				WIFI_TCP_SEND("Relay OFF:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			case 'C':
				BUZZER_SOLO1();		      //蜂鸣器输出单音的报警音
				WIFI_TCP_SEND("Beep:OK!\r\n");		      //发送AT指令  TCP发送数据内容
				break;
			case 'R':
						BUZZER_SOLO2();		      //蜂鸣器输出单音的报警音
						WIFI_TCP_SEND("Beep:OK!\r\n");		      //发送AT指令  TCP发送数据内容
						break;
			case 'D':
				LED_1(1);		      //LED1独立控制函数(0为熄灭,其他值为点亮)
				WIFI_TCP_SEND("LED1 ON:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			case 'E':
				LED_1(0);		      //LED1独立控制函数(0为熄灭,其他值为点亮)
				WIFI_TCP_SEND("LED1 OFF:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			default:
				//冗余语句
				break;
			}
			USART3_RX_STA = 0;		      //标志位清0,准备下次接收
		}
		if (KEY_1())		      //按下KEY1判断
		{
			BUZZER_SOLO2();		      //提示音
			WIFI_printf("AT+CIPSTART=\"TCP\",\"192.168.70.37\",3456\r\n");//发送AT指令 连接TCP服务器(IP和端口号需按实际修改)
			HAL_Delay(100);		      //等待
		}
		if (KEY_2())		      //按下KEY2判断
		{
			BUZZER_SOLO2();		      //提示音
			WIFI_TCP_SEND("www.doyoung.net\r\n");		    //发送AT指令 TCP模式下的发送数据
			HAL_Delay(100);		      //等待
		}

驱动文件

wifi.c

#include "wifi.h"
//WIFI模块通信,使用UART3,这是专用的printf函数
//调用方法:WIFI_printf("123"); //向USART2发送字符123
void WIFI_printf (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
    HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
}
//WIFI模块在TCP模式下的数据发送:TCP发送的规定是先发AT+CIPSEND=数量,等待返回“>“后再发送数据内容。
//调用方法:WIFI_TCP_SEND("123\r\n"); //TCP方式发送字符123和回车换行
void WIFI_TCP_SEND (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
	WIFI_printf("AT+CIPSEND=%d\r\n",i);//先发送AT指令和数据数量
	HAL_Delay(100);//等待WIFI模块返回">",此处没做返回是不是">"的判断。稳定性要求高的项目要另加判断。
    HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//发送数据内容(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
}
//所有USART串口的中断回调函数HAL_UART_RxCpltCallback,统一存放在【USART1.C】文件中。


wifi.h

#ifndef WIFI_WIFI_H_
#define WIFI_WIFI_H_
#include "stm32f1xx_hal.h" //HAL库文件声明
#include "../usart/usart.h"
#include "main.h"
#include <string.h>//用于字符串处理的库
#include <stdarg.h>
#include <stdlib.h>
#include "stdio.h"
extern UART_HandleTypeDef huart3;//声明UART2的HAL库结构体
void WIFI_printf (char *fmt, ...); //WIFI模块发送
void WIFI_TCP_SEND (char *fmt, ...);//在TCP模式下的发送数据(不处理返回状态的盲发)
#endif /* WIFI_WIFI_H_ */
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值