c#上位机:示波器功能

好久没有更新了,因为最近主要学习了如何用c#去做一个示波器功能,这里的示波器主要是用于单片机的调试。下面,我主要分享一下我做示波器的一些心得:

我这里示波器是用winform做的,了解到有很多开源的曲线控件,比如:chart,Oxyplot,scottplot,hslcontrols等,当然还有一些收费的曲线控件,这里就不一一说了。同时,自己画一个曲线图也是可以的。

最开始学习别人的示波器制作,如下:

这个示波器的原理:

1.首先定义在示波器界面代码里或者自己创建一个缓存数据的类,在定义静态的队列用来缓存数据,这里四个通道,则是4个队列

 public static volatile Queue<int> quedata1 = new Queue<int>(dataCountMax);//通道1数据
public static volatile Queue<int> quedata2 = new Queue<int>(10001);
public static volatile Queue<int> quedata3 = new Queue<int>(10001);
public static volatile Queue<int> quedata4 = new Queue<int>(10001);

2.在接收数据的地方先出一个数据,再进一个数据

 FrmScope.quedata1.Dequeue();
FrmScope.quedata1.Enqueue(comData.data1);
FrmScope.quedata2.Dequeue();
FrmScope.quedata2.Enqueue(comData.data2);
FrmScope.quedata3.Dequeue();
FrmScope.uedata3.Enqueue(comData.data3);
FrmScope.quedata4.Dequeue();
FrmScope.quedata4.Enqueue(comData.data4);

3.打开示波器界面时,先将队列填满

for (int i = 0; i < dataCountMax; i++)
{
if (quedata1.Count < dataCountMax)
{
quedata1.Enqueue(0);
quedata2.Enqueue(0);
quedata3.Enqueue(0);
quedata4.Enqueue(0); } }

4.将队列转化为数组赋值给自己画好的控件进行定时刷新,只要保证每个数据自己的采样时间间隔一样,波形应该就很完美

if (ScopeRun)
{
QueToArray(quedata1, arrScope1);
QueToArray(quedata2, arrScope2);
QueToArray(quedata3, arrScope3);
QueToArray(quedata4, arrScope4);
} Invalidate();//刷新显示

由于我自己做的一个调试软件通道特别多,而且没有固定的通道,需要做到随意添加曲线的功能,并且还由于美观原因就没有采用这种做法。于是,我去学习了一下scottplot和Oxyplot控件,学习发现,对于动态曲线,Oxyplot控件显示的更好且操作更方便,Scottplot在静态曲线上则更有优势,数据可达百万级别。经过甄别,我选择了Oxyplot控件。

示波器大致界面(这里我自己做的模拟数据方便展示):

思路如下:

1.首先我们先和上方一样,肯定要定义一个数据缓存的队列。不过,我们这里先定义了一个曲线实体类,用来存储数据,定义了一个公共类来缓存曲线以及索引曲线的名字,队列采用的是阻塞队列(生产者与消费者问题)。

2.模拟一下生产数据,存入队列

3.在另一个线程里面不断去索引所添加的曲线,自己可以封装一下添加和删除曲线的方法,这里就不展示了。

就这样,示波器功能就完成了。我采用阻塞队列这种方式去显示实时波形,不知道还有没有别的方法去实现,有好的见解可以评论区留言。

当然,上面做的过程中还有一些错误得必坑:

1.我存储的时候不存储时间可以不?我觉得实际过程中如果横坐标为点的个数的话,那你曲线采样的时间则是消费者的延时时间,特别是在出现故障再次恢复曲线时会出现时间间隔导致波形问题。

2.遍历曲线之前要先转化为list,不要在foreach里面去tolist,当你添加曲线时偶尔会报错。

3.消费者的时间可以往短了放,因为你横坐标为时间,不会影响实际的波形。

4.就是多线程里this.Invok的问题了,千万不要为了省事情,while循环里面先套个Invoke再说,这样是会耗时间的,只要针对你需要委托的地方用就行,别乱用。

c#之示波器功能的更多相关文章

  1. Jlink使用技巧之J-Scope虚拟示波器功能

    J-Link简介 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器.简单地说,是给一个JTAG协议转换盒.其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议. ...

  2. WPF中利用DynamicDataDisplay快速实现示波器功能

    DynamicDataDisplay控件是一个功能很强的绘图工具,除了能生成曲线外,还有很多其他功能,具体见http://dynamicdatadisplay.codeplex.com/.这里你也能下 ...

  3. 基于NIOS-II的示波器:PART3 初步功能实现

    本文记录了在NIOS II上实现示波器的第三部分. 本文主要包括:硬件部分的BRAM记录波形,计算频率的模块,以及软件部分这两个模块的驱动. 本文所有的硬件以及工程参考来自魏坤示波仪,重新实现驱动并重 ...

  4. Jlink使用技巧之虚拟串口功能

    前言 串口调试是单片机开发过程必不可少的一个功能,一般是使用一个UART-TTL的串口模块来实现串口的功能,其实下载调试使用的Jlink仿真器也可以实现串口调试的功能,本篇文章将介绍如何使用Jlink ...

  5. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

  6. Jlink使用技巧之读取STM32内部的程序

    前言 上一篇Jlink系列文章介绍了如何使用J-Flash来下载Hex或Bin文件到单片机,具体可参考Jlink使用技巧之单独下载HEX文件到单片机,本篇文章介绍,如何使用JFlash来读取单片机的程 ...

  7. Jlink使用技巧之单独下载HEX文件到单片机

    前言 上一篇文章介绍了使用Keil下载单独的Hex文件到单片机内,本篇文章介绍,如何使用SEGGER官方软件JFlash来进行程序的下载,支持Hex和Bin文件. JFlash的下载和安装 首先,安装 ...

  8. 百度智能手环方案开源(含源码,原理图,APP,通信协议等)

    分享一个百度智能手环开源项目的设计方案资料. 项目简介 百度云智能手环的开源方案是基于Apache2.0开源协议,开源内容包括硬件设计文档,原理图.ROM.通讯协议在内的全套方案,同时开放APP和云服 ...

  9. Keil开发环境如何生成BIN文件

    为什么需要BIN文件呢? 有些烧录器只支持BIN文件. 进行OTA远程升级时,只能使用BIN文件. 使用JLink脚本文件进行一键烧录时,只支持BIN文件. BIN文件要比HEX和AXF文件小的多. ...

  10. elf格式转换为hex格式文件的两种方法

    这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...

随机推荐

  1. JavaScript Bom和Dom的一般性详解

    一.JavaScript的组成 JavaScript的实现包括以下3个部分: ECMAScript(核心) 描述了JS的语法和基本对象. 文档对象模型 (DOM) 处理网页内容的方法和接口 浏览器对象 ...

  2. jQuery父子页面之间元素、方法获取、调用

    资源来自:https://www.cnblogs.com/it-xcn/p/5896231.html 一.jquery 父.子页面之间页面元素的获取,方法的调用: 1. 父页面获取子页面元素: 格式: ...

  3. BFS 颜色填涂———洛谷p1162

    填涂颜色 题目描述 由数字 \(0\) 组成的方阵中,有一任意形状的由数字 \(1\) 构成的闭合圈.现要求把闭合圈内的所有空间都填写成 \(2\).例如:\(6\times 6\) 的方阵(\(n= ...

  4. LeetCode 327. Count of Range Sum 区间和的个数

    给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper.区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 ...

  5. 什么是数据库连接池druid

    每次数据库连接都要断开重连浪费时间,性能 [ 底层需要 tcp 连接 ] 资源复用 : 提升系统响应速度 : 避免数据库连接遗漏 :[ 长时间不操作会强制断开 ] 使用: 初始连接数:连接的个数 pa ...

  6. gost socks5代理

    购买云主机 开放所有tcp端口 配置云主机 https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el8/x86_64/ 选择清华镜像源 [root@i ...

  7. 最详细CentOS7.6安装openGauss5.0.3教程

    一.环境准备 1.1 主机信息 项目 内容 操作系统 CentOS7.6 IP 192.168.4.201 主机名 opgs201 CPU 8core 内存 16GB 磁盘1 100GB 1.2 操作 ...

  8. 游戏推荐业务中基于 sentinel 的动态限流实践

    作者:来自 vivo 互联网服务器团队- Gao Meng 本文介绍了一种基于 sentinel 进行二次开发的动态限流解决方案,包括什么是动态限流.为什么需要引入动态限流.以及动态限流的实现原理. ...

  9. 一次彻底讲清如何处理mysql 的死锁问题

    MySQL 死锁 是指两个或多个事务互相等待对方持有的锁,从而导致所有事务都无法继续执行的现象.在 InnoDB 存储引擎中,死锁是通过锁机制产生的,特别是在并发较高.业务逻辑复杂的情况下,更容易发生 ...

  10. 玩黑悟空要配什么显卡?ToDesk云电脑一招搞定!

    近期国产游戏大作<黑神话·悟空>的预售开启,许多玩家对于如何配置自己的电脑以畅玩这款画质卓越.支持全景光追的3A大作产生了浓厚的兴趣. 尤其是显卡的选择,成为了玩家们关注的焦点.<黑 ...