STM32单片机与蓝牙模块HC-05通信数据帧处理

本章将会详细讲述蓝牙模块(HC-05)和STM32单片机之间的通信收发的数据如何处理,在测试开始前首先在手机上下载好一个蓝牙调试APP,此APP可以是手机端和PC端口的,以我常用的手机端的为例。

在配置工程之前先了解一下他的数据传输格式

一帧数据里面有以下数据:包头、原数据、校验位、包尾。

接下来我们在APP里面设置一个简单的工程以便我们验证后续的程序。

 APP设置操作到处就结束了,可以用USB转串口先看一下HC-O5收到的数据,可以看见接收到的16进制数,一共是七个字节,帧头一位、原始数据四位、校验位一位、帧尾一位。

接下来是把我们提前准备好的硬件STM32单片机和HC-05模块连接上,在此直接贴图片,其他涉及到的知识不多赘述,不知道怎么接线的请移步百度。

如何配置串口初始化函数这里也不多说,紧接着开始写接收函数。

void UART4_IRQHandler(void)   //串口4中断程序
{
	 static u8 res;	
	if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)//接收到数据
	{	 
		res =USART_ReceiveData(UART4);	
		UART4_Flow_Receive_Prepare(res);
	}

}	

void UART4_Flow_Receive_Prepare(u8 data)
{
    /* 局部静态变量:接收缓存 */
    static u8 RxBuffer[UART4_RECV_LEN];
    /* 数据长度 *//* 数据数组下标 */
    static u16  _data_cnt = 0;
    /* 接收状态 */
    static u8 state = 0;
 
    /* 帧头1 */
     if(state==0&&data==0xA5)
    {
//        state=1;
		state=2;
        _data_cnt = 0;
		RxBuffer[_data_cnt++]=data;
    }

    /* 接收数据组 */
    else if(state==2)
    {
        RxBuffer[_data_cnt++]=data;
        if((_data_cnt>=6||data==0x5A)&&_data_cnt>=1)
        {
					state=0;
					UART4_access_Data(RxBuffer,_data_cnt);
        }
    }
    /* 若有错误重新等待接收帧头 */
    else
        state = 0;
}
void UART4_access_Data(u8 data[],u16 i)
{ 
	u16 j=0;
	for(j=0;j<i;j++)
	{
		UART4_BT_date[j]=(u8)data[j];
//		printf("Received data:%d \n\r",UART4_BT_date[2]);
	}
	UART4_RX_STA=1;
	UART4_RX_deal();
}
u8 UART4_RX_deal(void)
{
	if(UART4_RX_STA)
	{

		UART4_RX_STA =0;
	}
}

再将收到的数据通过上位机调试助手打印出来

void task2_task(void *pvParameters)
{
    while(1)
    {
		DC12V_WS_EN=1;//开启12V电压

		ll=UART4_BT_date[1];
		lp=UART4_BT_date[2];
		lr=UART4_BT_date[3];
		lv=UART4_BT_date[4];
	if(ll==1)
	{
		printf("Received data:%d \n\r",UART4_BT_date[1]);
//		Auxiliary_PWM_cleaning(5000);
	}
		if(lr==2)
	{
		printf("Received data:%d \n\r",UART4_BT_date[3]);
//		Auxiliary_PWM_cleaning(-7000);
	}
	if(lp==6)
	{
		printf("Received data:%d \n\r",UART4_BT_date[2]);
//		Auxiliary_PWM_dust_collection(5000);
	}
		if(lv==7)
	{
		printf("Received data:%d \n\r",UART4_BT_date[4]);
		Auxiliary_PWM_dust_collection(-7000);
	}
	if (ll==0&&lr==0)
	{	
		Auxiliary_PWM_cleaning(0);
	}
	if (lp==0&&lv==0)
	{	
	Auxiliary_PWM_dust_collection(0);
	}

      vTaskDelay(5); 
    }
}

 到这里基本上就处理完接收到的数据了,下期将会介绍如何把数据发回手机APP查看,讲得不对的地方麻烦各位大佬评论区指出。

  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
STM32单片机可以通过串口通信控制HC-05蓝牙模块。 具体步骤如下: 1. 在STM32单片机上配置串口,设置波特率、数据位、停止位等参数。 2. 将HC-05蓝牙模块STM32单片机通过串口连接。 3. 在STM32单片机上编写程序,通过串口发送AT指令控制HC-05蓝牙模块。 4. HC-05蓝牙模块收到指令后执行相应的操作,比如连接蓝牙设备、发送数据等。 下面是一个简单的示例代码: #include "stm32f10x.h" #include "stdio.h" void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, (uint8_t)ch); } void USART1_SendString(char* str) { while (*str) { USART1_SendChar(*str++); } } int main(void) { USART1_Config(); // 发送AT指令,查询HC-05蓝牙模块名称 USART1_SendString("AT+NAME?\r\n"); while (1) { } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂造机人~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值