一个串口,如何被多个窗体调用?

pfworld 2013-08-27 02:51:54
例如一个电子秤传出的值,用于入库处理、出库处理,对外过磅。、

因为电子秤只有一个,而读取值的有3个窗体,老的办法是每次切换窗体,就关闭打开串口,在打开串口,这样有时候会出现串口打开失败的错误,引起不能再次打开串口,只能重启计算机,让串口状态还原。有没有办法,在主窗体打开串口,其他窗体直接读取主窗体的串口值,用过线程发现延迟厉害!有没有好的方法?
...全文
673 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
limilie 2014-10-06
  • 打赏
  • 举报
回复
我也遇到类似的问题,主窗口创建一个串口,有多个子窗口需要读写串口,并且子窗口还有子窗口需要读写串口,目前想到的办法只有信号和槽,但是很麻烦。比如孙子窗口需要写串口,就发信号给父亲窗口,父窗口接收到信号,使用槽函数再发信号给爷爷窗口;读串口,反过来。
ima_zhan 2014-08-17
  • 打赏
  • 举报
回复
引用 15 楼 u011689987 的回复:
[quote=引用 3 楼 ima_zhan 的回复:] delegate void ReadData(byte[] pData, int ilen); 主窗口 private event ReadData _ReadSerialData; 在接收数据的地方调用 ReadData(数据指针,数据长度); 子窗口中定义符合ReadData格式的函数 addData(byte[] pData, int iLen); 在主窗口中 _ReadSerialData += new ReadData(_subform1.addData); _ReadSerialData += new ReadData(_subform2.addData); 不知道这样行不行
我想问一下, _ReadSerialData += new ReadData(_subform1.addData); _ReadSerialData += new ReadData(_subform2.addData); 这个是写在主窗体的什么位置?我也在纠结这个问题,谢谢你![/quote] 我觉得该在主窗体调用,每增加一个SubForm就调用一次 如果有的SubForm需要删除应该加_ReadSerialData -= new ReadData(_subform1.addData);
lm溪 2014-08-16
  • 打赏
  • 举报
回复
引用 3 楼 ima_zhan 的回复:
delegate void ReadData(byte[] pData, int ilen); 主窗口 private event ReadData _ReadSerialData; 在接收数据的地方调用 ReadData(数据指针,数据长度); 子窗口中定义符合ReadData格式的函数 addData(byte[] pData, int iLen); 在主窗口中 _ReadSerialData += new ReadData(_subform1.addData); _ReadSerialData += new ReadData(_subform2.addData); 不知道这样行不行
我想问一下, _ReadSerialData += new ReadData(_subform1.addData); _ReadSerialData += new ReadData(_subform2.addData); 这个是写在主窗体的什么位置?我也在纠结这个问题,谢谢你!
wdbb 2013-08-31
  • 打赏
  • 举报
回复
加载很多硬件和子窗体,因此感觉在界面切换的时候有点停顿,不是想早起VB一样,立即显示。如何加快系统运行效率呢?
PaulyJiang 2013-08-28
  • 打赏
  • 举报
回复
静态变量是一个方法,还有一个是每个窗体里面需要调用的时候通过一个调用函数去读值也是个不错的方法。还有呢,就是你窗口打开的时候绑定一个委托,当串口的值发生变化的时候就触发这个委托,然后你的窗体就能得到值了,看你想怎么做了。
知擎物联 2013-08-28
  • 打赏
  • 举报
回复
你这个问题好比,我有一个变量存储了一个值,我想整个程序都能读取它,那么你想想你该怎么做?
pfworld 2013-08-28
  • 打赏
  • 举报
回复
窗体加载很多硬件和子窗体,因此感觉在界面切换的时候有点停顿,不是想早起VB一样,立即显示。如何加快系统运行效率呢?
jshi123 2013-08-27
  • 打赏
  • 举报
回复
你接收数据使用DataReceived事件,还是直接在ui线程中read? 如果在UI主线程中等待/读取的方式,就会界面操作互相干扰,造成延迟,应该用DataReceived事件。 在主窗口中定义一个 public Queue<byte> SerialData; 收到数据后 SerialData.Enqeue(data); 可以再定义一个 public event SerialDataReceived; 收到数据后触发 SerialDataReceived(); 其它子窗口可以注册这个事件,在事件处理程序中: var data = mainForm.SerialData.Dequeue()
pfworld 2013-08-27
  • 打赏
  • 举报
回复
引用 3 楼 ima_zhan 的回复:
delegate void ReadData(byte[] pData, int ilen); 主窗口 private event ReadData _ReadSerialData; 在接收数据的地方调用 ReadData(数据指针,数据长度); 子窗口中定义符合ReadData格式的函数 addData(byte[] pData, int iLen); 在主窗口中 _ReadSerialData += new ReadData(_subform1.addData); _ReadSerialData += new ReadData(_subform2.addData); 不知道这样行不行
尝试使用你说的方法,可以实现,不过还是老样子效率好像不高!
purple_snow 2013-08-27
  • 打赏
  • 举报
回复
用资源共享的方法怎么样 把测量出来的数据实时存放在公用类里 其他的子窗体孙窗体取的时候就会快多了 也就没必要实时使用串口读取数据啦
purple_snow 2013-08-27
  • 打赏
  • 举报
回复
感觉这三个数据不会是一次性测量出来的 为何会出现快速打开关闭而引起的错误?
pfworld 2013-08-27
  • 打赏
  • 举报
回复
1个程序,在主窗体下加载不同子窗体,子窗体又加载不同孙窗体,想在主窗体内实现串口数据读取,共享给不同子窗体,同一时刻只加载1个子窗体,加载那个子窗体,子窗体就显示主窗体共享的串口数据。而且切换不同子窗体时串口数据自动共享。
purple_snow 2013-08-27
  • 打赏
  • 举报
回复
是同一个程序中还是不同的?同一个的话就好做一点了
jshi123 2013-08-27
  • 打赏
  • 举报
回复
你说的窗体是一个程序中的,还是三个不同程序。 如果是同一个程序很好办,主窗口开三个fifo buffer,放上从串口收到的数据,其它窗口来读走就好了。 如果是不同程序,就要wcf来做进程间通信,或者用System.IO.Pipes,或者最简单的用文件来传递数据。
ima_zhan 2013-08-27
  • 打赏
  • 举报
回复
delegate void ReadData(byte[] pData, int ilen); 主窗口 private event ReadData _ReadSerialData; 在接收数据的地方调用 ReadData(数据指针,数据长度); 子窗口中定义符合ReadData格式的函数 addData(byte[] pData, int iLen); 在主窗口中 _ReadSerialData += new ReadData(_subform1.addData); _ReadSerialData += new ReadData(_subform2.addData); 不知道这样行不行
feiniao19830822 2013-08-27
  • 打赏
  • 举报
回复
串口对象设置为static。或者单例模式
rtdb 2013-08-27
  • 打赏
  • 举报
回复
后台一个线程读串口,前台窗体读线程数据

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧