上位机通过System.Windows.Forms.Timer检查串口,监控(ARM)仪器按键,然后收发数据……

时间:2022-01-10 20:35:08
PC与仪器使用串口联机通信。
仪器上有若干按键,若启动按键被按下,上位机程序须发送一系列指令,设置仪器各种工作流程,然后命令仪器启动。
仪器工作时将监控传感器,并实时发送AD值到PC,程序须即时显示收到的数值到界面并绘制曲线图,同时存储这些数据到集合。以便工作完成进行分析计算。

遇到的问题是:整个流程在大多数时候都是正常的,但有时会出现这种情况——程序与下位机通信正常,可以正确响应按键并发送测试流程,仪器也能按指令工作。但程序界面上无任何即时数值和曲线显示,更离奇的是:工作完成后,检查数据集合,发现所有数据都已被正常接收存储。而数据的接收、解码、显示、作图和AddItem到集合这段代码,是处于同一个程序块中的,中间没有任何逻辑判断来隔开。
另外,如果直接从上位机启动仪器,同一段程序的运行却非常稳定,从不出现上述问题。


在线等待高人释疑!

9 个解决方案

#1


但程序界面上无任何即时数值和曲线显示.(这段程序呢?)
是否是线程直接操作界面显示控件了? 查begininvoke

#2


试试使用多线程处理。

#3


给你点我用过的方法,构建一个与下位机进行通信的类,类中与下位机的接收和发送,均用多线程处理,收到数据后,把数据存到类的输出缓存,然后抛出收到数据事件,
主调用窗体中,实例化类,绑定接收数据事件,方法中用BeginInvoke把数据传到窗体UI线程中进行显示等的处理。。。

#4


当然中操作类中必须实现对下位机的一些控制 方法哈

#5


是否是线程直接操作界面显示控件了? 如果是,那么就是你说的这种现象。跨ui线程访问控件应当用beigininvoke实现。

#6


mabaolin兄:程序中并没有(也不需要)用到多线程。我们知道,SerialPort.DataReceived事件处理是在辅助线程上运行的,但我并没有处理这个事件。
另外,System.Threading.Timer和System.Timers.Timer类的Tick事件也在辅助线程上处理,但我用到是System.Windows.Forms.Timer,虽然处理过程中调用了多个子程序,但所有的处理都是在UI线程中进行的。

#1


但程序界面上无任何即时数值和曲线显示.(这段程序呢?)
是否是线程直接操作界面显示控件了? 查begininvoke

#2


试试使用多线程处理。

#3


给你点我用过的方法,构建一个与下位机进行通信的类,类中与下位机的接收和发送,均用多线程处理,收到数据后,把数据存到类的输出缓存,然后抛出收到数据事件,
主调用窗体中,实例化类,绑定接收数据事件,方法中用BeginInvoke把数据传到窗体UI线程中进行显示等的处理。。。

#4


当然中操作类中必须实现对下位机的一些控制 方法哈

#5


是否是线程直接操作界面显示控件了? 如果是,那么就是你说的这种现象。跨ui线程访问控件应当用beigininvoke实现。

#6


mabaolin兄:程序中并没有(也不需要)用到多线程。我们知道,SerialPort.DataReceived事件处理是在辅助线程上运行的,但我并没有处理这个事件。
另外,System.Threading.Timer和System.Timers.Timer类的Tick事件也在辅助线程上处理,但我用到是System.Windows.Forms.Timer,虽然处理过程中调用了多个子程序,但所有的处理都是在UI线程中进行的。