当前位置: 首页 > news >正文

09DSP学习-F28379D发送浮点数 Vofa+接收数据 使用JustFLoat数据引擎

在上一篇博客中,介绍了如何通过F28379D的串口发送数据,并使用Vofa+当做串口调试助手接收数据。在实际应用过程中,希望通过Vofa+绘制出曲线,B站和CSDN博客中有不少都进行了介绍。本文在上一篇博客的基础上,介绍如何通过F28379D实现使用Justfloat数据引擎发送数据给Vofa+并绘制曲线

了解JustFloat数据引擎

下图所示为Vofa+软件对JustFloat数据引擎的概述。关键在于发送完一段数据后需要在数据的最后发送帧尾,帧尾有要求,即需要发送0x00 0x00 0x80 0x7f。

89d3814f3471473285ed436bd9c2719c.png

使用F28379D的SCI串口发送数据

在前一篇博客中介绍过如何使用SCI发送数据

08DSP学习-利用syscfg配置串口SCI-CSDN博客

一个浮点数是4个字节,SCI串口一次只能发送一个字节,因此在发送数据之前,需要先将一个浮点数拆分成4个字节分别发送,然后再发送帧尾。

拆分1个浮点数为4个字节

利用union的特性

在 C 语言中,union 是一种数据结构,允许在同一内存位置存储不同类型的数据。它的特征和用法如下:

  1. 共享内存

    • 所有成员共用同一段内存,union 的大小是其最大成员大小的大小。这意味着在任何时候,只能使用 union 中的一个成员。
  2. 内存管理

    • 由于所有成员共享内存,union 的内存占用通常比结构体(struct)小,因为结构体的每个成员都有自己的内存空间。
  3. 访问方式

    • 可以通过点运算符(.)来访问 union 中的成员,但要小心,因为只应访问最近被赋值的成员

如下面的代码定义。定义一个SCI_FLOAT2BYTES的union,有两个成员,第一成员是结构体,结构体中有四个字节。第二个成员是浮点数,其大小也为四个字节,因此可以修改union中float类型的all成员,然后再依次读取union中SCI_BYTES类型的bits成员,达到将浮点数转换成四个单独字节的目的。

typedef struct
{uint16_t byte1 :8;uint16_t byte2 :8;uint16_t byte3 :8;uint16_t byte4 :8;
} SCI_BYTES;typedef union
{SCI_BYTES    bits;float         all;
} SCI_FLOAT2BYTES;

发送数据,以6通道为例

定义SendPlot6Chs函数,传入的6个参数分别为6个通道的浮点数。

step1,判断FIFO的状态是否可以发送数据。

step2,先发送1通道的数据。

首先,将1通道的数据幅值给union,然后依次发送union中的四个字节,发送结束后,发送2通道,以此类推。最后,发送数据帧尾0x00 0x00 0x80 0x7f。 具体代码如下。

void SendPlot6Chs(float ch1, float ch2, float ch3, float ch4, float ch5, float ch6)
{if (SCI_getTxFIFOStatus(mySCIB_BASE) == SCI_FIFO_TX0){switch(Tail_flag){case 0:Float2BytesTemp.all = ch1;SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte1);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte2);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte3);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte4);Tail_flag = 1; break;case 1:Float2BytesTemp.all = ch2;SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte1);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte2);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte3);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte4);Tail_flag = 2; break;case 2:Float2BytesTemp.all = ch3;SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte1);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte2);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte3);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte4);Tail_flag = 3; break;case 3:Float2BytesTemp.all = ch4;SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte1);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte2);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte3);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte4);Tail_flag = 4; break;case 4:Float2BytesTemp.all = ch5;SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte1);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte2);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte3);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte4);Tail_flag = 5; break;case 5:Float2BytesTemp.all = ch6;SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte1);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte2);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte3);SCI_writeCharNonBlocking(mySCIB_BASE,Float2BytesTemp.bits.byte4);Tail_flag = 6; break;case 6:SCI_writeCharNonBlocking(mySCIB_BASE,0x00);SCI_writeCharNonBlocking(mySCIB_BASE,0x00);SCI_writeCharNonBlocking(mySCIB_BASE,0x80);SCI_writeCharNonBlocking(mySCIB_BASE,0x7F);Tail_flag = 0; break;}}
}

最后在main.c的wihle(1)循环中,发送6个通道的数据

    while(1){SendPlot6Chs(1*DAC_Count,2*DAC_Count,3*DAC_Count,4*DAC_Count,5*DAC_Count,6*DAC_Count);}

其中DAC_Count的生成方式参考07DSP学习-利用syscfg配置PWM-DAC-CSDN博客

Vofa+观察数据

配置协议与连接

如下图所示配置协议和连接,端口号以你的电脑实际为准

ecdf957b32a44cfaba40eb09943d453d.png

配置控件

接着在控件标签页中拖入“波形图”的控件,可以将填充设置成全填充

6c1189bda4ef4357ad8e91254b902ecc.png

选择Y轴数据为 ALL

c8912a6e247d4dddaaf384cd9dd00a88.png

可以观察到6个通道的数据如下图所示,有6个通道的锯齿波,分别为DACOUT的1~6倍,

8e709b438fd5488eb1c79aa3373b5124.png

以上完成了SCI发送浮点数据并通过Vofa+绘制波形,希望对你有所帮助,我是ManTou!

 

 


http://www.mrgr.cn/news/60334.html

相关文章:

  • GPT打数模——电商品类货量预测及品类分仓规划
  • 在vue2中引用d3.js并进行自定义绘图
  • 关于嵌入式学习的一些短浅经验
  • git命令报错:fatal: not a git repository (or any of the parent directories): .git
  • Multi-Agent应用领域及项目示例
  • python对文件的读写操作
  • 中科院分区表能不能查SSCI分区?该怎么查?
  • 队列的实现(单链表)
  • 重采样方法(交叉验证法)——基于glm与LOOCV法(Weekly数据集分析)
  • C++-继承
  • 快速上手 Rust——环境配置与项目初始化
  • 天地图实现海量聚合marker--uniapp后端详细实现
  • 2024年推荐最详解析项目管理平台与敏捷开发的五个阶段
  • Redis内部数据结构Dict结构详解
  • DevTools 中的新滚动徽章
  • mac下使用docker安装php7.4环境
  • Spring MVC:响应结果和设置
  • Python Flask内存泄漏分析定位
  • Vue前端开发:数据绑定方法
  • php伪协议和move_uploaded_file、rename、copy等文件操作
  • 从0到1,搭建vue3项目
  • 单应性矩阵与相机内外参之间的关系
  • [Mv]_× = M [v]_× M^T的证明
  • flowable 去掉自带的登录权限
  • 基本法代码阅读
  • UDS诊断刷写–跳转执行