winform串口程序卡死

appGames 2016-07-26 10:31:06
winform里面开启一个线程,专门用来负责读取串口数据。
结果发现,如果串口上有设备故障的话,就读不到设备,到了超时时间就会返回。但这时候界面也卡死了。

后来,网上搜素发现,把程序入口从STA改成MTA,果然就好了。

但我主程序里有用treeview控件的,显示Dragdrop注册失败,我还担心别的界面上会不会出问题。这个改怎么解决呢?

怎么能做一个线程不停的读串口,又不会死机呢?
...全文
1372 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
appGames 2016-07-26
  • 打赏
  • 举报
回复
我有tryCatch的,串口是正常的,是这样子的,我一个串口上接了个MODBUS设备,这个设备有很多地址,比如地址1接温度传感器1,地址2接温度传感器2。。。,我打开串口之后,读地址1的数据,能读到,读地址2的数据,有可能地址2上设备有问题,就没读到地址2,然后接下去读地址3。。。如果有很多地址上读不到数据,系统就很很慢很慢了。 读不到数据的话,串口也是正常的,也是打开的,没有异常,只是调用串口写完数据之后,收不到正确的响应码。
巴士上的邂逅 2016-07-26
  • 打赏
  • 举报
回复
你不捕获串口异常吗?会用try..catch吗? 松动会抛IOException或者InvalidOperationException,超时会抛TimeoutException。 捕获了异常,将异常显示到界面,需要判断串口IsOpen,是否要重新Open
appGames 2016-07-26
  • 打赏
  • 举报
回复
但是设备会有故障啊,有了故障就会卡死。由于松动什么的,可能会引起故障,我希望是故障了别影=影响界面,界面上报出来就行。 到了超时时间就会返回 可能我没说清楚,我说的是,因为我串口上接了多个设备的,即使一个读不到数据,到了超时时间函数也会返回,进行下一个设备数据的读取。
巴士上的邂逅 2016-07-26
  • 打赏
  • 举报
回复
处理好设备故障就不会出问题。
引用
到了超时时间就会返回
是什么意思
拜一刀 2016-07-26
  • 打赏
  • 举报
回复
不知道很慢很卡是指什么,数据错误就丢弃,超时也该有超时时间,所以应该只是某组设备显示无数据的提示信息或者重传而已啊,顶多轮训周期变长一些
wanghui0380 2016-07-26
  • 打赏
  • 举报
回复
   // System.Net.Sockets.UdpClient
        [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true)]
        public static Task<UdpReceiveResult> ReceiveAsync(this UdpClient client)
        {
            return Task<UdpReceiveResult>.Factory.FromAsync((AsyncCallback callback, object state) =>client.BeginReceive(callback, state), delegate(IAsyncResult ar)
            {
                IPEndPoint remoteEndPoint = null;
                byte[] buffer = client .EndReceive(ar, ref remoteEndPoint);
                return new UdpReceiveResult(buffer, remoteEndPoint);
            }, null);
        }
这是微软的源代码,net4.5下的异步udp接收代码。net4没有这方法,不过你可以直接像上面那样扩展方法使用了 ps:如果配合另外的东西做(rx for net),效果更爽
  public static IObservable<UdpReceiveResult> ReceiveObservable(this UdpClient client)
        {
          
            return client.ReceiveAsync().ToObservable();
        }

        public static IObservable<int> SendObservable(this UdpClient client, byte[] msg, int bytes, string ip, int port)
        {
           return client.SendAsync(msg, bytes, ip, port).ToObservable();
        }

        public static IObservable<int> SendObservable(this UdpClient client, byte[] msg, int bytes, IPEndPoint endPoint)
        {
            return client.SendAsync(msg, bytes, endPoint).ToObservable();
        }

        public static IObservable<UdpReceiveResult> ReceiveStream(this UdpClient client)
        {
            return Observable.Defer(() => client.ReceiveObservable()).Repeat();
        }

1,978

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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