蓝牙
透传
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_ */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)