.Net C# 串口 Serialort safe handle has been closed 问题的解决

最近在一个平台上使用SerialPort类开发程序时,发现程序在使用SerialPort类时会异常退出,而且诡异的是,就算把所有操作串口的代码都放在try{}catch{}块中也无法捕获这个异常。最终,在国外一个论坛上发现了一个解决方法。

comport.open();

GC.SuppressFinalize(comport.BaseStream);

也就是在打开串口后,立刻调用GC.SuppressFinalize(comport.BaseStream);
这个函数可以阻止垃圾回收器去回收SerialPort类内部的Stream对象。问题也就解决了。发生这个问题的原因我并不知道,可能是.NET或者是串口驱动程序的一个BUG。
另外,理论上应该在串口关闭前调用
GC.ReRegisterForFinalize(comport.BaseStream);
comport.Close();
这样可以让垃圾回收器去回收SerialPort类内部的Stream对象.
但是有人在调用Close()函数时又得到了那个不能捕获的异常。所以我没有使用。况且,我的程序直到终止前都不会关闭串口,也就没有过多测试这行代码。
posted @ 2017-11-22 11:16  Fixing  阅读(615)  评论(0编辑  收藏  举报