c#之示波器功能

打印 上一主题 下一主题

主题 811|帖子 811|积分 2433

c#上位机:示波器功能

好久没有更新了,因为近来紧张学习了怎样用c#去做一个示波器功能,这里的示波器紧张是用于单片机的调试。下面,我紧张分享一下我做示波器的一些心得:
我这里示波器是用winform做的,相识到有很多开源的曲线控件,比如:chart,Oxyplot,scottplot,hslcontrols等,固然还有一些收费的曲线控件,这里就不一一说了。同时,自己画一个曲线图也是可以的。
最开始学习别人的示波器制作,如下:
这个示波器的原理:
1.首先定义在示波器界面代码里大概自己创建一个缓存数据的类,在定义静态的队列用来缓存数据,这里四个通道,则是4个队列
  1. public static volatile Queue<int> quedata1 = new Queue<int>(dataCountMax);//通道1数据
  2. public static volatile Queue<int> quedata2 = new Queue<int>(10001);
  3. public static volatile Queue<int> quedata3 = new Queue<int>(10001);
  4. public static volatile Queue<int> quedata4 = new Queue<int>(10001);
复制代码
2.在接收数据的地方先出一个数据,再进一个数据
  1. FrmScope.quedata1.Dequeue();
  2. FrmScope.quedata1.Enqueue(comData.data1);
  3. FrmScope.quedata2.Dequeue();
  4. FrmScope.quedata2.Enqueue(comData.data2);
  5. FrmScope.quedata3.Dequeue();
  6. FrmScope.uedata3.Enqueue(comData.data3);
  7. FrmScope.quedata4.Dequeue();
  8. FrmScope.quedata4.Enqueue(comData.data4);
复制代码
3.打开示波器界面时,先将队列填满
  1. for (int i = 0; i < dataCountMax; i++)
  2. {
  3.     if (quedata1.Count < dataCountMax)
  4.     {
  5.         quedata1.Enqueue(0);
  6.         quedata2.Enqueue(0);
  7.         quedata3.Enqueue(0);
  8.         quedata4.Enqueue(0);
  9.     }
  10. }
复制代码
4.将队列转化为数组赋值给自己画好的控件举行定时刷新,只要保证每个数据自己的采样时间隔断一样,波形应该就很完善
  1. if (ScopeRun)
  2. {
  3.     QueToArray(quedata1, arrScope1);
  4.     QueToArray(quedata2, arrScope2);
  5.     QueToArray(quedata3, arrScope3);
  6.     QueToArray(quedata4, arrScope4);
  7. }
  8. Invalidate();//刷新显示
复制代码
由于我自己做的一个调试软件通道特别多,而且没有固定的通道,需要做到随意添加曲线的功能,而且还由于美观原因就没有采用这种做法。于是,我去学习了一下scottplot和Oxyplot控件,学习发现,对于动态曲线,Oxyplot控件显示的更好且操纵更方便,Scottplot在静态曲线上则更有上风,数据可达百万级别。经过甄别,我选择了Oxyplot控件。
示波器大致界面(这里我自己做的模拟数据方便展示):
思路如下:
1.首先我们先和上方一样,肯定要定义一个数据缓存的队列。不过,我们这里先定义了一个曲线实体类,用来存储数据,定义了一个公共类来缓存曲线以及索引曲线的名字,队列采用的是阻塞队列(生产者与消耗者问题)。


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

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

就如许,示波器功能就完成了。我采用阻塞队列这种方式去显示实时波形,不知道还有没有别的方法去实现,有好的见解可以评论区留言。
固然,上面做的过程中还有一些错误得必坑:
1.我存储的时间不存储时间可以不?我觉得实际过程中如果横坐标为点的个数的话,那你曲线采样的时间则是消耗者的延时时间,特别是在出现故障再次恢复曲线时会出现时间隔断导致波形问题。
2.遍历曲线之前要先转化为list,不要在foreach里面去tolist,当你添加曲线时偶然会报错。

3.消耗者的时间可以往短了放,因为你横坐标为时间,不会影响实际的波形。
4.就是多线程里this.Invok的问题了,万万不要为了省事变,while循环里面先套个Invoke再说,如许是会耗时间的,只要针对你需要委托的地方用就行,别乱用。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表