智能车制作

标题: 分享一个20通道的虚拟示波器 [打印本页]

作者: 垆边月晓    时间: 2018-5-22 14:24
标题: 分享一个20通道的虚拟示波器
本帖最后由 垆边月晓 于 2018-5-22 14:54 编辑

小车调试时经常需要观察数据,常用的虚拟示波器有VisuaScope,匿名的地面站。visualscope操作方便,仅用鼠标就可以进行拖动和缩放,但是有波特率限制(破解版没有限制但兼容性不好)和通道限制(只能传输4通道,哪怕只用一组数据,也得把四个通道数据传完,非常占用CPU)。匿名的地面站功能很强大,通道数也很多,而且是免费的。但是个人觉得数据观察不太方便,不能任意缩放图像,只能按照选定窗口缩放,而且只可以放大不能缩小。为了更方便各位同学调试,把我写的[attach]92865[/attach]分享一下。
该示波器有以下几个特点:   

               1.操作简单。仅用鼠标就可以操作界面:鼠标左键可以任意方向拖动图像,右键上下拖动可以分别缩放X、Y轴图像,滚轮整体缩放图像。双击鼠标自动跟踪波形。
               2.点击图像任意位置可以在左下角显示坐标。
               3.多达20个数据通道。如果数据量小,可以只用部分通道,节省串口传输时间。
               4.最高波特率支持500000,com口可以任意
               5.支持串口Hex和文本显示,可以缓存2^64字节数据。               6.免安装,直接打开运行。


[attach]92862[/attach][attach]92863[/attach]




附:

                                                    20通道数字示波器使用说明
                                                                                                                                                          Author:垆边月晓
通讯协议:
        0xAA+0xAA+CMD+LEN+DATA0...+DATAx+SUM;
        如:AA AA 01 0C 01 0A FF 9C 43 F9 4B 70 00 01 91 F5 85
其中,前两个字节AA是帧头,第三个字节0x01是帧命令CMD(CMD=0x01:通道1~通道10;CMD=0x02:通道11~通道20),
第四个字节0x0C是数据长度LEN,第五位至倒数第二位为数据,最后一位为和校验位。
和校验:从第一位到倒数第二位相加求和得到的一个字节作为校验。
操作说明:
        拖动图像:按住鼠标左键拖动
        缩放图像:按住鼠标右键拖动或者滑动滑轮
        自动跟踪波形:双击鼠标左键

参考例程:
#define BYTE0(dwTemp)       (*(char *)(&dwTemp))
#define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
#define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))//0最低,3最高
void Data_Send(void)//备注:10个通道不必全用,如果只使用几个通道,其他通道可以删除(先删后面的通道),节省串口传输时间
{   
                unsigned char data_to_send[50];
        unsigned char _cnt=0;
        int  _temp;
                unsigned char sum = 0,i = 0;
        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0x01;
        data_to_send[_cnt++]=0;
        _temp = (int)(0);//通道1
        data_to_send[_cnt++]=BYTE1(_temp);//通道1
        data_to_send[_cnt++]=BYTE0(_temp);//通道1
        _temp = (int)(0);//通道2
        data_to_send[_cnt++]=BYTE1(_temp);//通道2
        data_to_send[_cnt++]=BYTE0(_temp);//通道2
        _temp = (int)(0);//通道3
        data_to_send[_cnt++]=BYTE1(_temp);//通道3
        data_to_send[_cnt++]=BYTE0(_temp);//通道3
         _temp = (int)(0);//通道4
        data_to_send[_cnt++]=BYTE1(_temp);//通道4
        data_to_send[_cnt++]=BYTE0(_temp);//通道4
        _temp = (int)(0);//通道5
        data_to_send[_cnt++]=BYTE1(_temp);//通道5
        data_to_send[_cnt++]=BYTE0(_temp);//通道5
        _temp = (int)(0);//通道6
        data_to_send[_cnt++]=BYTE1(_temp);//通道6
        data_to_send[_cnt++]=BYTE0(_temp);//通道6
                _temp = (int)(0);//通道7
        data_to_send[_cnt++]=BYTE1(_temp);//通道7
        data_to_send[_cnt++]=BYTE0(_temp);//通道7
                _temp = (int)(0);//通道8
        data_to_send[_cnt++]=BYTE1(_temp);//通道8
        data_to_send[_cnt++]=BYTE0(_temp);//通道8
                _temp = (int)(0);//通道9
        data_to_send[_cnt++]=BYTE1(_temp);//通道9
        data_to_send[_cnt++]=BYTE0(_temp);//通道9
                _temp = (int)(0);//通道10
        data_to_send[_cnt++]=BYTE1(_temp);//通道10
        data_to_send[_cnt++]=BYTE0(_temp);//通道10
        data_to_send[3] = _cnt-4;
        for( i=0;i<_cnt;i++)
                sum += data_to_send;
        
data_to_send[_cnt++] = sum;
        for(i=0;i<_cnt;i++)
                uart_putchar(UART1,data_to_send);
}












补充内容 (2018-5-22 15:40):
修复缩放bug,资源在3楼

补充内容 (2018-5-23 15:31):
最新版本v0.2.0增加了可任意通道接收浮点型数据,同时增加了数据显示系数,更方便调试!需要的请留言

补充内容 (2018-6-25 18:00):
v0.2.0资源见27楼

补充内容 (2018-6-25 18:06):
v0.2.0版本取消了exe加壳,打开速度会更快些
作者: invisiable-magi    时间: 2018-5-22 14:34
给楼主顶一个
作者: 垆边月晓    时间: 2018-5-22 15:39
本帖最后由 垆边月晓 于 2018-5-22 15:54 编辑

修复一个bug:一直操作缩放时,左右边界重合会出现未知错误[attach]92867[/attach]
作者: 垆边月晓    时间: 2018-5-22 15:44
如果还遇到其他bug,请回复,我会第一时间修复
作者: 2423474302    时间: 2018-5-22 16:05
顶一个
作者: 来一杯烈酒    时间: 2018-5-22 19:09
顶帖顶帖
作者: dxa572862121    时间: 2018-5-22 19:26
膜拜大佬。
作者: T童话    时间: 2018-5-23 11:11
感谢大佬分享~~~~~~~~~~~~~~~~
作者: 且随疾风    时间: 2018-5-23 17:37
感谢大佬分享
作者: Neptune!    时间: 2018-5-24 19:16
匿名基础上改的呀,顶一个
作者: Neptune!    时间: 2018-5-24 19:16
匿名基础上改的呀,顶一个
作者: Neptune!    时间: 2018-5-24 19:17
匿名基础上改的呀,顶一个
作者: 123321789    时间: 2018-5-25 17:51
:):):):)
作者: 123321789    时间: 2018-5-31 09:01
:):):):):)
作者: 123321789    时间: 2018-6-4 08:11
:):):):):)
作者: yanxi00    时间: 2018-6-9 20:30
端口不存在或被占用!这是为啥啊,用的蓝牙
作者: yanxi00    时间: 2018-6-9 20:40
传的时候为啥旁边的大小标尺没了
作者: 垆边月晓    时间: 2018-6-14 09:20
yanxi00 发表于 2018-6-9 20:30
端口不存在或被占用!这是为啥啊,用的蓝牙


这种情况一般是你没选择串口号
作者: 垆边月晓    时间: 2018-6-14 09:21
yanxi00 发表于 2018-6-9 20:40
传的时候为啥旁边的大小标尺没了


麻烦你截个图,描述再细致点
作者: yanxi00    时间: 2018-6-14 09:54
串口打不开
作者: sangchaochun    时间: 2018-6-14 10:15
是谁告诉你匿名地面站只能放大不能缩小,你是如何把匿名程序用到你的示波器上的,膜拜大佬!!!
作者: 垆边月晓    时间: 2018-6-14 14:21
sangchaochun 发表于 2018-6-14 10:15
是谁告诉你匿名地面站只能放大不能缩小,你是如何把匿名程序用到你的示波器上的,膜拜大佬!!!


请问怎么任意缩小?麻烦告知下?
作者: 垆边月晓    时间: 2018-6-14 14:26
yanxi00 发表于 2018-6-14 09:54
串口打不开


串口是不是被其他软件占用了?这个版本我在win7,8,10都测试过,不存在打不开串口的
作者: yanxi00    时间: 2018-6-14 15:26
我插有线可以打开,蓝牙就不可以,之前用山外的上位机都行
作者: 垆边月晓    时间: 2018-6-15 04:02
yanxi00 发表于 2018-6-14 15:26
我插有线可以打开,蓝牙就不可以,之前用山外的上位机都行


我用的龙邱蓝牙串口是可以打开的,不清楚你的是什么情况
作者: 旖风    时间: 2018-6-21 20:48
大佬,这个太实用了,求分享2.0的最新版本
作者: 垆边月晓    时间: 2018-6-25 17:56
修改说明:
          v0.2.0版:   
                    1.   修改数据传输方式,改为小端模式传输和接收(windows系统是小端模式)。
                          即由原来先传输BYTE[1]改为先传输BYTE[0]。
                    2.   增加数据类型选择(4字节的float和2字节的int16),任意通道都支持浮点据。
                          若是选择float 型,则BYTE[0],BYTE[1],BYTE[2],BYTE[3]依次传输(见参考例程第4通道)。                          
                    3.   增加波形系数(浮点型);
[attach]93019[/attach]
作者: 垆边月晓    时间: 2018-6-25 18:02
参考例程:
#define BYTE0(dwTemp)       (*(char *)(&dwTemp))
#define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
#define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))//0最低,3最高
void Data_Send(void)//备注:10个通道不必全用,如果只使用几个通道,其他通道可以删除(先删后面的通道),节省串口传输时间
{   
                unsigned char data_to_send[50];
        unsigned char _cnt=0;
        int  _temp;
                float  _f_temp;
                unsigned char sum = 0,i = 0;
        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0x01;
        data_to_send[_cnt++]=0;
        _temp = (int)(0);//通道1
        data_to_send[_cnt++]=BYTE0(_temp);//通道1
        data_to_send[_cnt++]=BYTE1(_temp);//通道1
        _temp = (int)(0);//通道2
        data_to_send[_cnt++]=BYTE0(_temp);//通道2
        data_to_send[_cnt++]=BYTE1(_temp);//通道2
        _temp = (int)(0);//通道3
        data_to_send[_cnt++]=BYTE0(_temp);//通道3
        data_to_send[_cnt++]=BYTE1(_temp);//通道3
           
               _f_temp=0;//传输浮点数据(任意通道都支持浮点数据)
               data_to_send[_cnt++]=BYTE0(_f_temp);//通道4       
               data_to_send[_cnt++]=BYTE1(_f_temp);//通道4
               data_to_send[_cnt++]=BYTE2(_f_temp);//通道4       
               data_to_send[_cnt++]=BYTE3(_f_temp);//通道4

        data_to_send[3] = _cnt-4;
        for( i=0;i<_cnt;i++)
                sum += data_to_send[i];
        data_to_send[_cnt++] = sum;
        for(i=0;i<_cnt;i++)
                uart_putchar(UART1,data_to_send[i]);
}

作者: wx_H7He_W33CM    时间: 2018-6-30 09:02
楼主你好,我想请问一下  你这个[_cnt]数组  是怎么和你程序里想要看的参数对应起来的呢?麻烦能细致讲一下吗
作者: 垆边月晓    时间: 2018-6-30 11:59
本帖最后由 垆边月晓 于 2018-6-30 12:03 编辑
wx_H7He_W33CM 发表于 2018-6-30 09:02
楼主你好,我想请问一下  你这个[_cnt]数组  是怎么和你程序里想要看的参数对应起来的呢?麻烦能细致讲一下 ...

你把你想看的变量赋值给_temp就可以了[attach]93028[/attach]

作者: wx_H7He_W33CM    时间: 2018-6-30 18:50
垆边月晓 发表于 2018-6-30 11:59
你把你想看的变量赋值给_temp就可以了

那比如说我想看我程序一个名为“pid_num”的变量,我是不是应该写成
pid_num=(int)(mpu9520.acc_x)
对吗?





作者: 垆边月晓    时间: 2018-7-1 11:33
wx_H7He_W33CM 发表于 2018-6-30 18:50
那比如说我想看我程序一个名为“pid_num”的变量,我是不是应该写成
pid_num=(int)(mpu9520.acc_x)
对 ...


不是的。是这样:_temp=(int)pid_num
作者: wx_H7He_W33CM    时间: 2018-7-1 13:00
垆边月晓 发表于 2018-7-1 11:33
不是的。是这样:_temp=(int)pid_num

那原本的后面的那个mpu9520是干嘛的?
还有那个acc_x 也不用加了吗?
是不是应该写成_temp=(int)(pid_num.acc_x)这样吗?

作者: 垆边月晓    时间: 2018-7-1 15:06
wx_H7He_W33CM 发表于 2018-7-1 13:00
那原本的后面的那个mpu9520是干嘛的?
还有那个acc_x 也不用加了吗?
是不是应该写成_temp=(int)(pid_n ...


不用加acc
作者: wx_H7He_W33CM    时间: 2018-7-3 17:52
楼主,我照你的方法试了,它提示有个报错。
请问一下你的uart_putchar函数是怎么写的?
还有个问题就是,它在uart.h里的定义怎么写,是这样吗:“void uart_putchar (UART_MemMapPtr uartch, uint8 ch);”
作者: 垆边月晓    时间: 2018-7-3 18:56
wx_H7He_W33CM 发表于 2018-7-3 17:52
楼主,我照你的方法试了,它提示有个报错。
请问一下你的uart_putchar函数是怎么写的?
还有个问题就是, ...


这是山外自带的库,串口输出函数
作者: wx_H7He_W33CM    时间: 2018-7-4 14:56
楼主可以把你的uart_putchar函数里边的发一下吗?
还有这个函数在uart.h里的定义。
作者: 垆边月晓    时间: 2018-7-5 17:00
本帖最后由 垆边月晓 于 2018-7-5 17:02 编辑
wx_H7He_W33CM 发表于 2018-7-4 14:56
楼主可以把你的uart_putchar函数里边的发一下吗?
还有这个函数在uart.h里的定义。

[attach]93060[/attach]这是山外K60的库函数 。如果你不是K60单片机,用你的单片机串口发送函数就行

作者: 垆边月晓    时间: 2018-7-5 17:09
wx_H7He_W33CM 发表于 2018-7-4 14:56
楼主可以把你的uart_putchar函数里边的发一下吗?
还有这个函数在uart.h里的定义。

[attach]93061[/attach]
这是山外库函数。如果你不是使用的这款单片机,这个函数是没有用的,你得用你的串口发送函数替换掉uart_putchar就可以了





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2