STM32 串口 DMA 发送数据到 Vofa+
本文的目的是分享一种通过STM32Cubemx配置 串口 DMA,进而发送数据到Vofa+上位机去显示波形的方法,该方法有数据可视化清晰,波形基本不失真,数据传输稳定等优点。
该方法效果远优于使用重定向发送。
一、CubeMX的相关配置
1.1 USART1&DMA&中断
基础配置:
这里因为只发送数据所以设置为只发模式。

DMA和中断配置:


二、相关代码
2.1 main.c
while
{
Vofa_UpdateData(); //调用函数,发送数据,在Vofa+上显示
}
2.2 vofa.h
这里的vofa.h和vofa.c需要添加到keil5文件里面,如若不清楚具体操作可以上网查询。
#ifndef __VOFA_H__
#define __VOFA_H__
#include "main.h"
#include <string.h>
#define VOFA_CH_NUM 5 // 通道数,这里的通道数根据自己需要设置
#define VOFA_TAIL_LEN 4 // 帧尾长度
#define VOFA_FRAME_LEN (VOFA_CH_NUM * 4 + VOFA_TAIL_LEN) // 总帧长
typedef struct
{
float dat[VOFA_CH_NUM]; // 数据
uint8_t frame[VOFA_FRAME_LEN]; // 打包好的帧
} Vofa_t;
extern Vofa_t vofa;
void Vofa_Update(void); // 更新发送数据
void Vofa_Send(void); // 打包并 DMA 发送
#endif
2.3 vofa.c
#include "vofa.h"
void Vofa_Update(void)
{
vofa.dat[0] = 1; //这里就是刚才设置的通道数对应的内容
vofa.dat[1] = 2; //设置5个通道这里就能发送5个数据
vofa.dat[2] = 3;
vofa.dat[3] = 4;
vofa.dat[4] = 5;
void Vofa_Send(void);
}
void Vofa_Send(void)
{
// 1. 将浮点数组拷贝到帧缓冲区前部
memcpy(vofa.frame, vofa.dat, sizeof(vofa.dat)); //memcpy需要包含 string.h 头文件
// 2. 附加 JustFloat 帧尾
vofa.frame[VOFA_FRAME_LEN - 4] = 0x00;
vofa.frame[VOFA_FRAME_LEN - 3] = 0x00;
vofa.frame[VOFA_FRAME_LEN - 2] = 0x80;
vofa.frame[VOFA_FRAME_LEN - 1] = 0x7F;
// 3. 启动 DMA 发送
HAL_UART_Transmit_DMA(&huart1, vofa.frame, VOFA_FRAME_LEN);
}
三、Vofa+
3.1 设置
Vofa+可以在浏览器等官网网方下载。

3.2 图像显示




最后得到图像,我们发送的是5个数据,1,2,3,4,5对应图上5条线。
四、总结
本文介绍了通过STM32CubeMX配置串口DMA实现数据发送到Vofa+上位机显示波形的方法。主要内容包括:
1)使用CubeMX配置USART1为只发模式并启用DMA和相关中断;
2)编写相关代码实现数据更新和发送功能,通过memcpy打包浮点数据并附加帧尾;
3)在Vofa+上位机中接收并显示5个通道的测试数据(1-5)。该方法实现了STM32与Vofa+的通信,为数据可视化提供了一种高效解决方案,适用于需要实时波形显示的嵌入式应用场景。
更多推荐

所有评论(0)