c#之示波器功能
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#之示波器功能的更多相关文章
- Jlink使用技巧之J-Scope虚拟示波器功能
J-Link简介 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器.简单地说,是给一个JTAG协议转换盒.其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议. ...
- WPF中利用DynamicDataDisplay快速实现示波器功能
DynamicDataDisplay控件是一个功能很强的绘图工具,除了能生成曲线外,还有很多其他功能,具体见http://dynamicdatadisplay.codeplex.com/.这里你也能下 ...
- 基于NIOS-II的示波器:PART3 初步功能实现
本文记录了在NIOS II上实现示波器的第三部分. 本文主要包括:硬件部分的BRAM记录波形,计算频率的模块,以及软件部分这两个模块的驱动. 本文所有的硬件以及工程参考来自魏坤示波仪,重新实现驱动并重 ...
- Jlink使用技巧之虚拟串口功能
前言 串口调试是单片机开发过程必不可少的一个功能,一般是使用一个UART-TTL的串口模块来实现串口的功能,其实下载调试使用的Jlink仿真器也可以实现串口调试的功能,本篇文章将介绍如何使用Jlink ...
- 基于51单片机IIC通信的PCF8591学习笔记
引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...
- Jlink使用技巧之读取STM32内部的程序
前言 上一篇Jlink系列文章介绍了如何使用J-Flash来下载Hex或Bin文件到单片机,具体可参考Jlink使用技巧之单独下载HEX文件到单片机,本篇文章介绍,如何使用JFlash来读取单片机的程 ...
- Jlink使用技巧之单独下载HEX文件到单片机
前言 上一篇文章介绍了使用Keil下载单独的Hex文件到单片机内,本篇文章介绍,如何使用SEGGER官方软件JFlash来进行程序的下载,支持Hex和Bin文件. JFlash的下载和安装 首先,安装 ...
- 百度智能手环方案开源(含源码,原理图,APP,通信协议等)
分享一个百度智能手环开源项目的设计方案资料. 项目简介 百度云智能手环的开源方案是基于Apache2.0开源协议,开源内容包括硬件设计文档,原理图.ROM.通讯协议在内的全套方案,同时开放APP和云服 ...
- Keil开发环境如何生成BIN文件
为什么需要BIN文件呢? 有些烧录器只支持BIN文件. 进行OTA远程升级时,只能使用BIN文件. 使用JLink脚本文件进行一键烧录时,只支持BIN文件. BIN文件要比HEX和AXF文件小的多. ...
- elf格式转换为hex格式文件的两种方法
这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...
随机推荐
- MySQL 大表拆分
概述 在实际工作中,在关系数据库(MySQL.PostgreSQL)的单表数据量上亿后,往往会出现查询和分析变慢甚至无法执行统计分析的情况.这时就需要将大表拆分为多个小表,将小表分布在多个数据库上,形 ...
- Flutter Web 近期的重要更新
我们的发布重点优先关注在性能.开发者体验以及 Web 集成上 2021 年 3 月 Flutter Web 支持已进入稳定版,那么,下一步是什么? 我们对用户研究发现,有超过 10% 的 Flutte ...
- 离线安装MySQL
离线安装mysql [下载地址](MySQL :: Download MySQL Community Server) 解压后依次执行如下命令 rpm -ivh mysql-community-comm ...
- Windows 中的硬链接、目录联接(软链接)、符号链接、快捷方式
在Linux文件系统中经常提及硬链接(Hard Link)和符号链接(Symbolic Link),Windows中也可以创建链接,但由于丰富的图形界面操作,很少提及链接.Windows 的 NTFS ...
- 谷歌浏览器页面乱码问题在浏览器端解决,charset下载安装;
一 下载插件(百度网盘) 链接:https://pan.baidu.com/s/1o9Zuo2m 密码:rrcz 二 将下载好的插件拖到谷歌浏览器中 三 如果谷歌浏览器右下角出现如下图 ...
- sigmod、tanh、ReLU激活函数的实现
import torch import torch.nn.functional as F import matplotlib.pyplot as plt import numpy as np x = ...
- Android复习(三)清单文件中的元素——>application
<application> 语法: <application android:allowTaskReparenting=["true" | "false ...
- Android复习(二)应用资源——>可绘制对象资源
可绘制对象资源是图形的一般概念,是指可在屏幕上绘制的图形,以及可使用 getDrawable(int) 等 API 检索,或应用到拥有 android:drawable 和 android:icon ...
- HTB打靶记录-Cicada
Nmap Scan nmap扫描一下ip nmap -sT -sV -O -Pn 10.10.11.35 Nmap scan report for 10.10.11.35 Host is up (0. ...
- 云原生周刊:K8sGPT 加入 CNCF | 2024.1.8
开源项目推荐 VolSync VolSync 使用 rsync 或 rclone 在集群之间异步复制 Kubernetes 持久卷.它还支持通过 Restic 创建持久卷的备份. KubeClarit ...