串口示波器---伏特加 彻底的爱了

Posted 嵌入式@hxydj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串口示波器---伏特加 彻底的爱了相关的知识,希望对你有一定的参考价值。

  最近在调试代码的时候发现了一款串口示波器软件,功能相当强大,而且上手起来非常容易。目前是我自己使用过的多款串口显示软件里功能最强大的,而且是免费的。

  软件名字叫 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 就可从控件中获取数据。

  还有其他许多强大的功能,这里就不一一列举了。反正自从用了这个软件之后,就彻底爱上它了。以后调试代码这个软件肯定是必不可少的。

  试用了几次之后,发现这个软件有个问题,就算每次打开软件后就会自动加载上一次测试的值,然后显示曲线中的波形也会显示上次测试的波形。但是有时候不想显示上次测试的值,而是需要重新显示。但是这个软件没有清空缓存的按钮,于是只能手动去删除这个软件的缓存。当缓存删除之后,打开软件后就会像第一次打开那样,需要重新设置。手动删除软件缓存的方法如下:

  在C盘中找到自己用户的文件夹,用户名文件夹中有个AppData的文件夹,这个文件夹默认是隐藏的,需要显示隐藏文件才可以看到。


  进入到AppData文件夹中。

  接着进入Local文件夹中

  这时就可看到一个vofa+的文件夹,这个就是伏特加软件的缓存目录,可以将这个文件夹中的所有内容删除。

  将这个文件夹中内容全部删除之后,下次在打开VoFa+软件时,就像第一个打开一样,所有的数据和设置都没有了,需要自己重新设置。如果不想重新设置界面中的其他参数,只是单纯想清除上次保存的数据,可以将100文件夹留下,其他的文件全部删除。


  这样再打开软件时,界面还是上次的界面,只是数据被清空了,不过这时有个BUG,就是此时显示曲线中所有的显示线条都会变成白色,需要将软件关了再打开一次。也就是需要重新打开2次软件,波形显示才能正常。

  出现这种情况就关闭软件,重新打开一次。

  关闭软件再重新打开一次之后,此时波形显示就正常了。

以上是关于串口示波器---伏特加 彻底的爱了的主要内容,如果未能解决你的问题,请参考以下文章

山外调试助手虚拟示波器串口通信协议

身价过亿的妖媚子对小码农说串口能传送我的爱吗?

关于串口数据用示波器分析的问题

小梅哥FPGA进阶教程第九章 基于串口猎人软件的串口示波器

基于瑞芯微RV1109 Linux串口驱动调试心得(给正点原子DS100示波器点赞!)

分享一个开源的QT的串口示波器