蓝牙调试器 接收处理 hc-05蓝牙上传数据

前言

测试项目地址:https://gitee.com/killerp/stm32_ble_debug

串口是我们经常用来输出数据的接口,使用一些蓝牙串口模块,如HC-05能方便的通过蓝牙将串口数据发送到上位机,省去了串口连线到电脑的步骤。

今天分享一个功能强大的APP,蓝牙调试器,它具备以下功能

  • 发送/接收蓝牙串口的数据

  • 自定义蓝牙串口 发送/接收数据包格式

  • 支持多种控件:如按键,文本,滑动窗口,坐标轴显示等。

尤其是自定义数据包格式 和 多种可选的控件 是数据处理强大工具!

本次实验基于stm32及HC-05蓝牙串口模块,上位机为安卓手机,蓝牙调试器下载:

应用商店搜索 蓝牙调试器,APP图标见下图:

在这里插入图片描述

一,设置数据包格式

APP界面如图所示,设备连接 与 对话模式 都是基操 ,我们直奔主题:专业调试

在这里插入图片描述

首先新建一个工程,暂时取名为demo,我们需要关注 编辑控件 和 通信设置 功能;先进入通信设置,设置我们的数据包格式:

根据自己的数据需求,设置数据包内传输的数据。数据包的格式设置规则如下:

  • 起始字节:0xA5
  • 原始数据
  • 校验和(原始数据所有字节之和,再取低8bit数据)
  • 结束字节:0x5A

数据格式支持bool,char,short,int,float四种c语言常用的数据类型,在本次例程中,我将传输char,short,int,float类型的数据。假定我们要发送和接收的数据包格式如下:

在这里插入图片描述

根据上面的数据包格式,到APP中的发送和接收数据包界面,分别添加一个char,short,int,float的变量;如图:到此我们就完成了数据包格式的设置了。

在这里插入图片描述

二,编辑控件

这里以Y-T一维波形图为例子,简单介绍控件的设置流程:

点击+,选择Y-T一维波形图,随后弹出下面窗口:

该波形图能同时显示6个通道的数据,Receive表示数据来自接收的数据包,随后是数据类型,最后是链接到上一步中我们创建的变量。

在这里插入图片描述

补充:右上角的黄色的齿轮可设置数据接收周期,这个取决于逆串口发送的周期,暂时设置为100ms。同时还能支持控件的移动和缩放等。

三,stm32 串口发送

蓝牙调试器的设置基本完成了,接下来就是单片机的串口程序设计了,这里以stm32为例子:

简单介绍一下串口的配置:

  • 串口波特率:9600
  • 使能DMA发送
  • 使能接收中断

这一段代码显示如何组装我们的数据:

#define USART_TX_LEN 14	//数据包大小
extern uint8_t USART_TX_BUF[USART_TX_LEN];	//数据包缓存区
		char x = 0x01;	
		short y = 0x02;
		int z = 0x03;
		float f = 4.5;	
		
		USART_TX_BUF[0] = 0xA5;	
	
		USART_TX_BUF[1] = (uint8_t)x;
	
		Short_to_Byte(y,&USART_TX_BUF[2]);
	
		Int_to_Byte(z,&USART_TX_BUF[4]);
	
		Float_to_Byte(f,&USART_TX_BUF[8]);

		//计算校验和
		USART_TX_BUF[12] =(uint8_t) ((USART_TX_BUF[1]+USART_TX_BUF[2]+USART_TX_BUF[3]+USART_TX_BUF[4]+USART_TX_BUF[5]+USART_TX_BUF[6]+USART_TX_BUF[7]+USART_TX_BUF[8]+USART_TX_BUF[9]+USART_TX_BUF[10]+USART_TX_BUF[11])&0xff);
	
		USART_TX_BUF[13] = 0x5A;
	
		//通过串口1发送
		ble_send(USART_TX_BUF,14);
		
		//延时100ms
		delay_ms(100);

串口发送函数:

//send data to hc-05
int ble_send(uint8_t *data,int len)
{
	while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);	//wait until tx complete
	if(!data)return -1;
	HAL_UART_Transmit_DMA(&huart1,data,len);	//ʹÓÃDMAģʽ·¢ËÍ
	while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);
	return 0;
}

要将short,int,float类型变量转换为字节类型变量,才能通过串口传输,下面函数实现转换功能:

void Int_to_Byte(int i,uint8_t *byte)
{

	unsigned long longdata = 0;
	longdata = *(unsigned long*)&i;          
	byte[3] = (longdata & 0xFF000000) >> 24;
	byte[2] = (longdata & 0x00FF0000) >> 16;
	byte[1] = (longdata & 0x0000FF00) >> 8;
	byte[0] = (longdata & 0x000000FF);

}
void Float_to_Byte(float f,uint8_t *byte)
{

	unsigned long longdata = 0;
	longdata = *(unsigned long*)&f;          
	byte[3] = (longdata & 0xFF000000) >> 24;
	byte[2] = (longdata & 0x00FF0000) >> 16;
	byte[1] = (longdata & 0x0000FF00) >> 8;
	byte[0] = (longdata & 0x000000FF);

}

void Short_to_Byte(short s,uint8_t *byte)
{
      
	byte[1] = (s & 0xFF00) >> 8;
	byte[0] = (s & 0xFF);
}

蓝牙调试器接收界面显示:

在这里插入图片描述

四,stm32 串口接收

首先,我们在 蓝牙调试器 中添加 可编辑文本 控件 来输入我们要发送的数据

本实验中,我们发送一帧数据包给stm32,stm32解析出数据后,对数据进行加法运算并返回到蓝牙调试器。

实现效果如图:

黑色框中显示接收到的数据,绿色框中显示发送的数据;

对于char 类型+1,short+2,int+3,float+1.1;

在这里插入图片描述
stm32使能串口接收中断,并在中断中处理数据:

#define USART_RX_LEN 14
uint8_t USART_RX_BUF[USART_RX_LEN];

typedef struct {
	uint8_t option;	//bit0 indecate weather the msg is recved
	char x;
	short y;
	int z;
	float f;
}Ble_Data;

Ble_Data rec_data;	//蓝牙接收结构体
void USART1_IRQ_Cb(void)                	
{ 
	uint8_t err = 0;
	if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x5a结尾0xa5开头)
	{
    HAL_UART_Receive(&huart1,USART_RX_BUF,USART_RX_LEN,100); //读取串口接收的一字节数据到Res
		
		//检查包头,包尾
		if(USART_RX_BUF[0]==0xa5 && USART_RX_BUF[USART_RX_LEN-1]==0x5a)
		{
			//检查校验和
			err = (uint8_t) ((USART_RX_BUF[1]+USART_RX_BUF[2]+USART_RX_BUF[3]+USART_RX_BUF[4]+USART_RX_BUF[5]+USART_RX_BUF[6]+USART_RX_BUF[7]+USART_RX_BUF[8]+USART_RX_BUF[9]+USART_RX_BUF[10]+USART_RX_BUF[11])&0xff);
			if(err!=USART_RX_BUF[12])
			{
				//返回错误 数据无效
				rec_data.option |=0x00;
				return ;
			}
			//数据有效
			rec_data.option |=0x01;
			
			//将buff中的字节数据转换成指定类型
			rec_data.x = (char)USART_RX_BUF[1];
			rec_data.y = *((short *) (&USART_RX_BUF[2]));
			rec_data.z = *((int *) (&USART_RX_BUF[4]));
			rec_data.f = *((float *) (&USART_RX_BUF[8]));

		} 		 
	}

}

在这里插入图片描述

### 蓝牙调试器波形数据分析与工具 #### 数据采集方法 蓝牙调试助手应用程序支持多种控件,例如摇杆、参数微调框、能量槽、开关以及波形图等。这些控件能够帮助用户更直观地操作和监控数据传输过程。然而,在实际应用中,数据接收处理可能较为复杂。通常情况下,该类应用程序采用特定的数据帧格式来完成数据收发工作[^1]。 对于波形数据的具体采集流程,可以通过以下方式实现:在前端界面添加一个波形图控件,并将其连接到后台运行的数据流模块上,从而达到实时显示信号的目的。这种设计不仅简化了用户的交互体验,还提高了系统的可视化程度[^2]。 #### 波形分析工具 为了进一步提升波形数据的质量并减少噪声干扰,可以引入FFT算法进行频域变换计算。假设当前采样率为300kHz,则每秒可获取约30万个样本点;如果目标频率为10kHz,则只需从中选取连续的30个点即可重构完整的正弦曲线形状。重复此过程多次(比如取10组这样的子序列),再分别求其对应的幅值谱后再做均值运算便能得到最终的结果[^4]。 另外值得注意的是,在某些特殊场景下还需要考虑其他因素的影响,如温度漂移或者电源电压波动等因素可能会引起测量误差增大等问题。因此建议定期校准传感器零位输出值以确保长期稳定性良好表现。 ```python import numpy as np from scipy.fftpack import fft def calculate_fft(data, sample_rate=300e3): N = len(data) T = 1 / sample_rate yf = fft(data) xf = np.linspace(0.0, 1.0/(2.0*T), int(N/2)) amplitude_spectrum = 2/N * abs(yf[:N//2]) return xf, amplitude_spectrum # Example usage with dummy data dummy_data = np.sin(np.arange(0, 1024*10)*np.pi*2*(500/sample_rate)) + \ np.random.normal(scale=.1,size=(1024*10,)) xfrequencies, amplitudes = [], [] for i in range(10): segment_start = i * (len(dummy_data)//10) segment_end = (i+1)*(len(dummy_data)//10)-1 freqs, amps = calculate_fft(dummy_data[segment_start:segment_end],sample_rate=300e3) xfrequencies.append(freqs);amplitudes.append(amps) average_amplitude = sum(amplitudes)/float(len(amplitudes)) print("Average Amplitude Spectrum:", average_amplitude) ``` 上述代码片段展示了如何利用Python库`numpy`和`scipy`来进行快速傅里叶变换(Fast Fourier Transform),进而获得输入信号的幅度谱信息。通过这种方法可以帮助我们更好地理解所捕获波形背后的物理意义及其特性变化规律。 #### 实际案例分享 - ESP32-S3 ADC多路同步采集方案 考虑到嵌入式开发平台的选择多样性,这里特别提到了一种基于ESP32-S3芯片实现四通道模拟量数字化转换的应用实例。整个项目涵盖了从硬件选型到最后功能验证各个环节的内容介绍: - **硬件部分**主要包括核心处理器单元即ESP32-S3模组本身以及其他外围电路元件; - **软件方面**则涉及IDE安装部署、PlatformIO插件配置等方面的知识要点讲解; - 同时也深入剖析了几处关键技术细节,像定时触发机制设定、DMA控制器初始化等等都是保障高效稳定工作的基础要素之一; - 最终经过一系列测试表明这套解决方案具备较高的性价比优势同时满足工业控制领域内的典型需求特征[^3]。 ---
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值