最近在调试代码的时候发现了一款串口示波器软件,功能相当强大,而且上手起来非常容易。目前是我自己使用过的多款串口显示软件里功能最强大的,而且是免费的。
软件名字叫 VOFA+,中文名称叫伏特加。官网地址:https://www.vofa.plus/ ,官网界面如下:
点立即下载按钮进入到下载界面
支持在多个系统上运行,其中Windows版本还可以下载免安装版,也就是下载的文件夹解压后就可以直接运行。功能和安装版没有任何区别。这里下载的是免安装版。解压后文件夹如下:
双击vofa+.exe打开软件。
首先选择自己需要使用的数据接口。
这个软件支持串口和网口,我自己使用的是单片机测试,所以这里选择的是串口,然后设置好串口的端口号和波特率。
接下来还需要选择数据引擎,这里软件支持3种数据引擎。
下面依次看这3种数据引擎的使用方法。
FireWater
这个协议使用起来和正常串口数据输出没有区别,就是需要在数据的最后加上换行,不同的数据之间使用逗号隔开。下面直接使用代码测试:
void wave1_test( void )
{
static int i = 0, j = 1000;
if( i > 1000 )
i = 0;
if( j < 0 )
j = 1000;
printf( "%d,%d\n", i++, j-- );
}
定义两个整形数据,然后一个自加,一个自减。然后使用printf()函数将这两个数据打印出来。在main()函数中的while()循环中直接调用wave1_test()函数就行。
此时在软件界面上选择使用 FireWater协议,然后打开伏特加软件的串口。
这时候软件下方就可以看到数据已经打印出来了,但是此时还不能显示波形,需要添加波形的控件。
单击左侧边框最下方的控件按钮,然后将第一个波形图控件拖动到右侧空白区域内。
在控件中单击鼠标右键,选择填充,然后选择第一个选项,也就是按照对角线的方式填充。
当波形控件全部填充好之后,在波形控件上单击鼠标右键,选择Y轴,然后选择ALL,也就是使用所有通道的数据填充。
此时右上角I0和I1两个通道后面的数据就会变化,但是这时候波形显示的还不正常。单击软件中间的Auto按钮,让波形自动调整。
这时候波形就正常的显示出来了。通过拖动Auto按钮底下的第三个彩色小圆点,还可以调整波形显示的样子。
在波形上使用鼠标滚轮可以缩放波形的大小,按住鼠标左键可以直接移动波形的显示位置。这样就可以根据自己的需要调整波形显示。
在波形X轴上双击鼠标左键,可以添加一条测量标尺。
通过标尺可以实时显示波形当前的数值大小,标尺可以添加多个。如果要删除标尺的话,最标尺最下方的黑点上单击鼠标右键,然后选择删除就可以了。
单击通道名称前面的图标,可以关闭通道波形的显示。
单击一下通道,可以修改通道的名称,还可以设置波形显示的位置。
Y偏置就是改变波形显示的最低位置,默认情况下都是从0开始显示的,但是这样的话,两个波形就会重叠在一起,为了方便观察,就将第二个波形下移-2000个数据点。这样波形看起来就更直观了。
波形动态显示效果图如下:
波形种类还可以修改,在波形上右键图形种类里面选择自己想要的显示方式。
通过这种方法不仅可以输出整数波形,浮点数同样也支持。比如这里将代码中的两个变量修改为浮点数。
void wave1_test( void )
{
static float i = 0, j = 1000;
if( i > 1000 )
i = 0;
if( j < 0 )
j = 1000;
printf( "%f,%f\n", i+=1.1, j-=2.1 );
}
输出波形如下:
同样一个输出整数,一个输出浮点数也是可以的。
接下来看第二种数据引擎
JustFloat
通过名字就可以看出,这个是针对浮点数的。
使用这个数据引擎的话,数据结尾必须是4个固定的字符
0x00, 0x00, 0x80, 0x7f
前面的数据为浮点数据的16进制格式,这里将浮点数转换为16进制时,数据必须是小端格式。由于在单片机中浮点数占4个字节,要直接将浮点数转换为4个字节不容易实现,这里可以直接借助联合体来完成这个功能。
union
{
unsigned char a[4];
float b;
} temp;
这里定义一个联合体,里面包含了一个字符数组和一个浮点数,字符数组占4个字节,浮点数也占四个字节,这样在内存中,字符数组和浮点数共享同一片数据存储区。这样在操作数据的时候可以直接操作联合体中的浮点数,当需要输出数据的时候,直接发送联合体中的字符数组就行。
这里可以直接先通过一个简单的例子来验证一下联合体。
将联合体中的浮点数设置为1.0,然后通过单步调试观察联合体中数组中的值。在这里可以通过在线计算网站,计算浮点数转换为 16进制数的结果 https://www.asciim.cn/hex/float.html
通过对比在线转换结果和单片机监控的值可以看出,联合体中数组的值和在线转换的值一样,但是在单片机数组中转换后的值是按照大端模式存储的。那么在通过串口发送数据时需要最先发送数组中最后一个字节,按照倒叙的方式发送数据。
下面编写一段代码来测试JustFloat数据引擎。
//使用联合体将浮点数转换为4个 u8类型数据
union
{
unsigned char a[4]; //在单片机中浮点存储为大端模式,高字节在低位,低字节在高位。
float b;
} temp;
unsigned char tail[4] = {0x00, 0x00, 0x80, 0x7f}; //结尾
//发送数据
void showData( float data )
{
int i;
temp.b = data;
for( i = 3; i >= 0; i-- ) //发送浮点数 小端模式发送
SendChar( temp.a[i] );
}
//发送结尾协议
void showTail( void )
{
int i;
for( i = 0; i < 4; i++ ) //发送结尾
SendChar( tail[i] );
}
定义一个联合体用来将浮点数转换为16进制的数组,然后定义一个数组存放结束命令。接下来使用 showData() 函数专门来发送16进制的数组数据,由于通过联合体转换出来的浮点数是按照大端模式存储的,而数据引擎接收的数据必须是小端模式,所以在发送数据的时候就从数组最后一位开始发送,最后发送数组第一位数据,这样通过倒叙发送就把大端模式的数据转换成立小端模式数据。最后通过 showTail() 函数发送结尾指令。
下面通过通过两个浮点变量来测试。
void wave2_test( void )
{
static float t1 = 0.0, t2 = 0.0;
showData( t1 );
showData( t2 );
showTail();
t1 += 3.0;
t2 += 1.0;
if( t1 > 1000 )
t1 = 0;
if( t2 > 1000 )
t2 = 0;
}
在主函数中循环调用 wave2_test( ) 函数,输出波形如下:
在查看波形前需要重新设置一下软件,首先点软件左上角的圆点,关闭串口,然后将数据引擎修改为 JustFloat 。
然后再点一下左上角的圆点按钮,打开串口。
此时波形显示出来了,但是底下的数据时乱码。这里要将数据显示从字符模式改为16进制格式,点Auto按钮按钮底下的三个点按钮。
将显示方式设置为十六进制,这时数据区域的数据就显示正常了。数据波形如下所示:
RawData
RawData数据引擎和普通的串口功能意义,只是单纯的显示数据,不会对数据进行解析,也不会显示波形。发送什么数据就显示什么数据。比如这里循环打印0到100.
void wave3_test( void )
{
int i;
for( i = 0; i < 100; i++ )
printf( "%d\n", i );
}
显示数据如下所示:
还可以在控件界面中选择其他的控件来显示数据。
拖动其他两种控件到显示区域中。
然后在控件上单击右键,选择绑定通道 I0,将数据通道绑定到控件上。
两个控件都将数据绑定上。接下来编写测试代码,由于这两个控件显示数据的范围都比较小,所以这里测试数据范围就设置为从 -1.0 到 1.0。
void wave3_test( void )
{
float i = -1.0f;
for( i = -1.0 ; i < 1.0; i+=0.1f )
{
printf( "%f\n", i );
delay_ms(5);
}
}
输出波形如下:
这个软件不仅可以接收命令,同时还可以发送命令,在左侧选择第三个命令选项,可以新添加命令,同时还可以将控件中的按钮和命令绑定,这样每按下一次按钮,软件就会通过串口向外发送一次命令。
也可以将控件上显示的值直接发送出去,通过转义字符 %f 就可从控件中获取数据。
还有其他许多强大的功能,这里就不一一列举了。反正自从用了这个软件之后,就彻底爱上它了。以后调试代码这个软件肯定是必不可少的。