09DSP学习-F28379D发送浮点数 Vofa+接收数据 使用JustFLoat数据引擎
在上一篇博客中,介绍了如何通过F28379D的串口发送数据,并使用Vofa+当做串口调试助手接收数据。在实际应用过程中,希望通过Vofa+绘制出曲线,B站和CSDN博客中有不少都进行了介绍。本文在上一篇博客的基础上,介绍如何通过F28379D实现使用Justfloat数据引擎发送数据给Vofa+并绘制曲线
了解JustFloat数据引擎
下图所示为Vofa+软件对JustFloat数据引擎的概述。关键在于发送完一段数据后需要在数据的最后发送帧尾,帧尾有要求,即需要发送0x00 0x00 0x80 0x7f。
使用F28379D的SCI串口发送数据
在前一篇博客中介绍过如何使用SCI发送数据
08DSP学习-利用syscfg配置串口SCI-CSDN博客
一个浮点数是4个字节,SCI串口一次只能发送一个字节,因此在发送数据之前,需要先将一个浮点数拆分成4个字节分别发送,然后再发送帧尾。
拆分1个浮点数为4个字节
利用union的特性
在 C 语言中,union
是一种数据结构,允许在同一内存位置存储不同类型的数据。它的特征和用法如下:
-
共享内存:
- 所有成员共用同一段内存,
union
的大小是其最大成员大小的大小。这意味着在任何时候,只能使用union
中的一个成员。
- 所有成员共用同一段内存,
-
内存管理:
- 由于所有成员共享内存,
union
的内存占用通常比结构体(struct
)小,因为结构体的每个成员都有自己的内存空间。
- 由于所有成员共享内存,
-
访问方式:
- 可以通过点运算符(
.
)来访问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+观察数据
配置协议与连接
如下图所示配置协议和连接,端口号以你的电脑实际为准
配置控件
接着在控件标签页中拖入“波形图”的控件,可以将填充设置成全填充
选择Y轴数据为 ALL
可以观察到6个通道的数据如下图所示,有6个通道的锯齿波,分别为DACOUT的1~6倍,
以上完成了SCI发送浮点数据并通过Vofa+绘制波形,希望对你有所帮助,我是ManTou!