基于C#实现高效示波器功能

 更新时间:2024年12月13日 08:48:44   作者:小码编匠  
这篇文章介绍了用 C#实现示波器功能的方法,包括使用 WinForm 及多种曲线控件,阐述了原理和思路,如定义缓存数据的队列、转化数组刷新显示等,还提到注意事项及扩展特性,最后呼吁点赞支持和交流,需要的朋友可以参考下

前言

如何用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# 上位机软件不仅实现了基本的示波器功能,还提供了丰富的扩展特性,极大地方便了在研发、测试和维护过程中对电信号的监测与分析。

最后

以上就是基于C#实现高效示波器功能的的详细内容,更多关于C#实现高效示波器的资料请关注脚本之家其它相关文章!

相关文章

  • C# Onnx实现特征匹配DeDoDe检测

    C# Onnx实现特征匹配DeDoDe检测

    这篇文章主要为大家详细介绍了C# Onnx如何实现特征匹配DeDoDe检测,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • 详解ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008)

    详解ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+Object

    这篇文章主要介绍了ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008),本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C#使用集合实现二叉查找树

    C#使用集合实现二叉查找树

    这篇文章介绍了C#使用集合实现二叉查找树的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C#调用exe文件的方法详解

    C#调用exe文件的方法详解

    这篇文章主要为大家详细介绍了C#调用exe文件的相关方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-04-04
  • C#各种正则表达式验证方法整理大全

    C#各种正则表达式验证方法整理大全

    许多编程语言和工具都包含对正则表达式的支持,C#也不例外,这篇文章主要给大家介绍了关于C#各种正则表达式验证方法整理大全的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • C# windows语音识别与朗读实例

    C# windows语音识别与朗读实例

    这篇文章主要为大家详细介绍了C# windows语音识别与朗读实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C# 如何使用批处理启动Windows服务

    C# 如何使用批处理启动Windows服务

    这篇文章主要介绍了C#使用批处理启动Windows服务,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • C# 减少嵌套循环的两种方法

    C# 减少嵌套循环的两种方法

    最近在解决性能优化的问题,看到了一堆嵌套循环,四五层级的循环真的有点过分了,在数据量成万,十万级别的时候,真的非常影响性能。本文介绍了C# 减少嵌套循环的两种方法,帮助各位选择适合自己的优化方案,优化程序性能
    2021-06-06
  • c#实现把异常写入日志示例(异常日志)

    c#实现把异常写入日志示例(异常日志)

    这篇文章主要介绍了c#实现把异常写入日志示例(异常日志),需要的朋友可以参考下
    2014-04-04
  • C# DropDownList中点击打开新窗口的方法

    C# DropDownList中点击打开新窗口的方法

    C# DropDownList中点击打开新窗口的方法,需要的朋友可以参考一下
    2013-03-03

最新评论