stm32 HC05驱动

news/2024/11/8 2:52:02/

这个模块提供了格式化发送字符串到HC05的功能,占用stm32的串口3
1.头文件

#ifndef __HC_05
#define __HC_05
/*
本模块为HC05蓝牙透传模块,只写了通信,AT指令部分
单独用串口测试
因此本模块基本就是个串口
占用串口USART3
PB10 TX 5v兼容
PB11 RX 5v兼容*/
#include "sys.h"
#define HC05_REC_LEN  			100  	//定义最大接收字节数 100
#define HC05_TEC_LEN  			100  	//发送缓存区 100void initHC05(void);			//初始化
void sendToHC05(char* fmt ,...);//发送到HC05
static void receiveHandler(void);
static void SendCharToHC05(u8 ch);//私有
extern char HC05_RX_BUF[HC05_REC_LEN];
#endif

2.c文件

#include "hc05.h"
#include "stdarg.h"
#include "stdio.h"
#include "delay.h"
#include <string.h> 
#include <stdlib.h>
#include "main.h"//PB10 模块RX
//BB11 模块TX
//注意,读取USARTx->SR能避免莫名其妙的错误   	
char HC05_RX_BUF[HC05_REC_LEN];     //接收缓冲
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 HC05_RX_STA=0;       //接收状态标记	  
void initHC05(void){GPIO_InitTypeDef  GPIO_InitStructure;USART_InitTypeDef  USART_InittStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);USART_DeInit(USART3);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //TX复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;    GPIO_Init(GPIOB, &GPIO_InitStructure);               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //RX浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);USART_InittStructure.USART_BaudRate = 9600;  //波特率USART_InittStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流设置USART_InittStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //接收发送模式USART_InittStructure.USART_Parity = USART_Parity_No; //奇偶校验位USART_InittStructure.USART_StopBits = USART_StopBits_1; //停止位USART_InittStructure.USART_WordLength = USART_WordLength_8b; //字长USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  //设置中断类型,接收中断NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //串口3中断,在stm32F10x.h中有定义NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级为3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //响应优先级为3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure);USART_Init(USART3, &USART_InittStructure);USART_Cmd(USART3, ENABLE);
}
void USART3_IRQHandler(void)
{u8 Res;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){Res =USART_ReceiveData(USART3);	//读取接收到的数据if((HC05_RX_STA&0x8000)==0){	//接收未完成if(HC05_RX_STA&0x4000){	//接收到了0x0dif(Res!=0x0a){HC05_RX_STA=0;//接收错误,重新开始}else {//接收完成了HC05_RX_STA|=0x8000;//完成逻辑:printf("recrived: %s",HC05_RX_BUF);receiveHandler();HC05_RX_STA=0;HC05_RX_STA&=~0x8000;//清除完成标志}	 }else {//还没收到0X0D	if(Res==0x0d){HC05_RX_STA|=0x4000;}else {HC05_RX_BUF[HC05_RX_STA&0X3FFF]=Res ;HC05_RX_STA++;if(HC05_RX_STA>(HC05_REC_LEN-1))HC05_RX_STA=0;//接收数据错误,重新开始接收	  }		 }}}
}
//向蓝牙发送一个字节
void SendCharToHC05(u8 ch){      while((USART3->SR&0X40)==0);//等待发送完毕   USART3->DR = ch;      
}
//格式化发送到蓝牙
void sendToHC05(char* fmt ,...){unsigned char i,num;char lcd_buf[HC05_TEC_LEN];va_list ap;va_start(ap,fmt); num=vsprintf(lcd_buf,fmt,ap);//printf("num=%d\r\n",num);for(i=0;i<num;i++){SendCharToHC05(lcd_buf[i]);//printf("char=%c\r\n",lcd_buf[i]);}va_end(ap);
}
//接收回调,处理和解析命令
//指令格式:XXXX;arg0;arg1;arg2
void receiveHandler() {//指令表const char* list[] = {"setpid", "restart!", "hello","SetCapBeginFlag","restart"};unsigned char count = 0;double args[3] = {0};char* token;char* cmd;char delim[] = ";";int i;int length = sizeof(list) / sizeof(char*);//先获得命令,';'分割cmd = strtok(HC05_RX_BUF, delim);printf("cmd= %s\r\n", cmd);//然后解析参数,最多3个,解析成doubletoken = strtok(NULL, delim);    while (token != NULL && count < 3) {args[count] = atof(token);count++;token = strtok(NULL, delim);        }for (i = 0; i < length; i++) {if (strcmp(cmd, list[i]) == 0) break;}//printf("cmd N=%d\r\n",i);//printf("length=%d\r\n",length);//按照解析的命令查找执行if (i < length) {switch (i) {case 0:pid.Kp = args[0];pid.Ki = args[1];pid.Kd = args[2];printf("setpid:p=%f i=%f d=%f\r\n",args[0],args[1],args[2]);savePIDdata();__set_FAULTMASK(1);// 关闭所有中断NVIC_SystemReset();// 复位break;case 1:__set_FAULTMASK(1);// 关闭所有中断NVIC_SystemReset();// 复位printf("cmd%d\r\n", i);break;case 2:printf("cmd%d\r\n", i);printf("hello world\r\n");break;case 3:printf("cmd%d\r\n", i);pauseFlag=0;break;case 4:printf("cmd%d\r\n", i);pauseFlag=1;break;default:break;}}
}

IO配置:
PB10 TX 5v兼容
PB11 RX 5v兼容

初始化initHC05()
其中发送可用格式化发送函数sendToHC05,与printf的格式相同
接收需要修改receiveHandler() 函数。接受到数据后会在中断里调用此函数


http://www.ppmy.cn/news/719635.html

相关文章

HC-05学习笔记

大家好&#xff01;新手上路&#xff0c;请多多指教&#xff01; 网上有很多大佬也做了这个HC-05的文章&#xff0c;我这个文章只是个人学习笔记&#xff0c;如果有侵犯到那位大佬请与我联系谢谢。也是希望对一次的学习做一个记录&#xff0c;也能够希望帮助到其他的小伙伴们。…

hc sr04流程图_超声波传感器HC-SR04

型号 及功 能 HC-SR04 超声波测距模块 相近 产品 &#xff11;、本模块性能稳定&#xff0c;测度距离精确。能和国外的 SRF05,SRF02 等超声波测距模块相媲美。 模块高精度 盲区( 2cm )超近 , 稳定的测距是此产品成功走向市场的有力根据&#xff01; 产品 应用 领域 机器人避障 …

stm32驱动hc595

根据网上资料&#xff1a; 595具体使用的步骤:第一步&#xff1a;目的&#xff1a;将要准备输入的位数据移入74HC595数据输入端上。方法&#xff1a;送位数据到_595。第二步&#xff1a;目的&#xff1a;将位数据逐位移入74HC595&#xff0c;即数据串入方法&#xff1a;SH产生一…

74HC165应用介绍

74HC165时一款高速CMOS器件&#xff0c;兼容低功耗肖特基TTL系列。8位并行输入串行输出移位寄存器&#xff0c;可在末极得到互补的串行输出Q7&Q7非&#xff0c;由器件真值表可以了解读取数据所需要的时序&#xff0c; 并行读取管脚PL非低电平时D0~D7口输入的并行数据将被异…

74hc165C语言程序,74hc165级联用法(74hc165级联电路图及程序)

74HC165的级联电路图 74HC165是一款高速CMOS器件,74HC165遵循JEDEC标准no.7A。74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列。 74HC165是8位并行读取或串行输入移位寄存器,可在末级得到互斥的串行输出(Q7和Q7),当并行读取(PL)输入为低时,从D0到D7口输入的并行数据将被异步地…

74hc595级联c语言程序,74hc595级联程序范例

74HC595具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器有相互独立的时钟。数据在SH_cp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在ST_cp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个…

node获取文件夹下所有js文件的模块

创建 index.js const fs require(fs) const path require(path)const folderPath path.join(__dirname, api)console.log(目录路径&#xff1a;, folderPath)let moduleObj {}fs.readdirSync(folderPath).forEach((file) > {const filePath path.join(folderPath, file…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 3 日论文合集)

文章目录 一、检测相关(9篇)1.1 Federated Ensemble YOLOv5 - A Better Generalized Object Detection Algorithm1.2 Zero-shot Nuclei Detection via Visual-Language Pre-trained Models1.3 Federated Object Detection for Quality Inspection in Shared Production1.4 Comp…