本文的目的是分享一种通过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+的通信,为数据可视化提供了一种高效解决方案,适用于需要实时波形显示的嵌入式应用场景。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐