2 zxzr1990 zxzr1990 于 2017.09.19 14:29 提问

【求问】C# WPF 串口丢失卡死问题

接触C#一个月,正在写一个串口接收数据绘图的软件。
发现串口意外断开后程序卡死,必须要从任务管理器才能关闭。
VS上也没有任何报错,就是卡在那里不动。
分析时间线看卡死的那一段什么任务都没有执行。。

程序的大概是用DispatcherTimer做无限循环,
串口接收来的数据放进Queue里面然后用OXYplot绘图。

请问有什么方法可以看到程序卡在哪里了吗?
或者说有没有类似经历的解决办法?谢谢!!

2个回答

song8870
song8870   2017.09.20 16:30

目测断开了,串口监听进入死循环,等一段时间,应该会报出异常,类似超时,断开的异常,建议逐步下断点,手动断开串口,看看在哪段代码上卡死,对该代码进行异常捕捉和处理

zxzr1990
zxzr1990   2017.10.06 09:46

找到了。因为读取串口用的readline,断开之后readline一直在等换行符来,就卡死了 。
加上readtimeout就好了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C# 串口通信(彻底解决C#串口通信中的数据丢失问题)
以网上某位大虾的源码为版本,沿用了其可用的代码部分。对其余欠妥部分进行了改造。不要资源分,是大家不用为积分而烦恼。出来混都不容易,希望大家相互照应!
C#串口控件关闭时死机卡住
搞了三天的串口
C# 关闭串口卡死
用C#编写的wince串口通信程序基本大功告成了,与之前用API函数和线程来做串口通信不同,这次直接使用SerialPort控件来做,原本以为使用控件做会简单和方便许多,没成想,还遇到了很多麻烦。        通信协议解析判断、控件数据更新显示等等都没有给我造成什么障碍,却偏偏在“关闭串口”这个地方卡壳了。        在网上看了很多帖子,发现遇到这一问题的人还比较多,按他们的建议和方法都
C# 解决串口关闭时程序卡死问题
关于串口关闭原理的资料:http://blog.csdn.net/wuyazhe/article/details/5606276 个人使用解决方案,将Invoke变为BeginInvoke。
关于C#/WPF的SerialPort类串口接受数据异常的问题
如题所说,在软件测试过程中,
C#串口关闭Close()-线程卡死-解决方法
问题很简单: 1.设置isReceiving 标志位,判断串口读取线程是否在占用资源。 2.设置读写超时,防止卡死在Read()命令里本人比较懒, 在代码关键修改位置标了/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/,供大家参考。希望能帮到大家0 0 class CSerial { SerialPort myPor
C#简易示波器,图形化显示串口数据
用C#开发的一个简易示波器,显示下位机通过串口上传的波形数据,采用Mschart控件完成绘图功能呢,源代码采用Framework 3.5框架,要安装MSchart3.5控件正常使用。修改为Framework 4.9框架,visual studio2010自带该控件,可直接使用。
C# WPF 串口发送程序
关于串口通信,之前用MFC架构的时候做过一次,也写了文章如下: MFC RS232串口通信 最近的项目因为对于界面的美化要求高了很多,用MFC架构去美化界面是件要命的事,因此转而用了WPF架构。其中用到的串口通信部分自然也就只能重新研究下了。关于虚拟串口的工具还有串口调试工具,则用的还是原来MFC相关文章所提供的那两个,有需要的可以去那篇文章的下载链接中下载。 稍微研究了WPF架构的串口实现,
C# USB转串口突然拔出检测解决方案(二)
用异常的方法来解决这个问题,首先还是捕获USB设备的拔出消息,由于.NET并不知道串口的拔出,要是该串口正在使用,这是对串口的访问将会产生异常,所以通过捕获异常来处理是最好有方便的。代码如下:   protected override void WndProc(ref Message m)         {             if (m.Msg == 0x0219)      
串口通信丢失数据结局方案——C#
串口通信的一般思路是:先接收数据,然后处理数据,并在数据处理之后再次等待接收新的数据。但这种方法的缺点是,在串口高速率大信息量通信时,会出现丢失数据的情况。        丢失数据的原因是数据接收和数据处理再同一个线程中,如果数据处理的时间太长,则来不及接收的数据只能暂存在缓存中。因此,一旦缓存满了,新到的数据就会冲刷掉未来得及接收的数据,从而造成数据的丢失。因此,只是增加缓存的容量不能解决数据