日期:2014-05-17  浏览次数:21210 次

一个串口,如何被多个窗体调用?
例如一个电子秤传出的值,用于入库处理、出库处理,对外过磅。、

因为电子秤只有一个,而读取值的有3个窗体,老的办法是每次切换窗体,就关闭打开串口,在打开串口,这样有时候会出现串口打开失败的错误,引起不能再次打开串口,只能重启计算机,让串口状态还原。有没有办法,在主窗体打开串口,其他窗体直接读取主窗体的串口值,用过线程发现延迟厉害!有没有好的方法?
串口

------解决方案--------------------
后台一个线程读串口,前台窗体读线程数据
------解决方案--------------------
串口对象设置为static。或者单例模式
------解决方案--------------------
你说的窗体是一个程序中的,还是三个不同程序。
如果是同一个程序很好办,主窗口开三个fifo buffer,放上从串口收到的数据,其它窗口来读走就好了。
如果是不同程序,就要wcf来做进程间通信,或者用System.IO.Pipes,或者最简单的用文件来传递数据。
------解决方案--------------------
是同一个程序中还是不同的?同一个的话就好做一点了
------解决方案--------------------
感觉这三个数据不会是一次性测量出来的 为何会出现快速打开关闭而引起的错误?
------解决方案--------------------
用资源共享的方法怎么样
把测量出来的数据实时存放在公用类里 其他的子窗体孙窗体取的时候就会快多了 也就没必要实时使用串口读取数据啦
------解决方案--------------------
你接收数据使用DataReceived事件,还是直接在ui线程中read?
如果在UI主线程中等待/读取的方式,就会界面操作互相干扰,造成延迟,应该用DataReceived事件。

在主窗口中定义一个 public Queue<byte> SerialData;
收到数据后 SerialData.Enqeue(data);
可以再定义一个 public event SerialDataReceived;
收到数据后触发 SerialDataReceived();
其它子窗口可以注册这个事件,在事件处理程序中:
var data = mainForm.SerialData.Dequeue()

------解决方案--------------------
你这个问题好比,我有一个变量存储了一个值,我想整个程序都能读取它,那么你想想你该怎么做?
------解决方案--------------------
静态变量是一个方法,还有一个是每个窗体里面需要调用的时候通过一个调用函数去读值也是个不错的方法。还有呢,就是你窗口打开的时候绑定一个委托,当串口的值发生变化的时候就触发这个委托,然后你的窗体就能得到值了,看你想怎么做了。