C# 关闭串口卡死

用C#编写的wince串口通信程序基本大功告成了,与之前用API函数和线程来做串口通信不同,这次直接使用SerialPort控件来做,原本以为使用控件做会简单和方便许多,没成想,还遇到了很多麻烦。

       通信协议解析判断、控件数据更新显示等等都没有给我造成什么障碍,却偏偏在“关闭串口”这个地方卡壳了。

       在网上看了很多帖子,发现遇到这一问题的人还比较多,按他们的建议和方法都试过了,比如,加close和dataReceive接收标志的方式,或者close之后再Dispose释放资源,或者Application.DoEvents()处理完所有信息再close.............试了能想到的所有办法,最终都试验失败,该死机还是会死机,只是之前,第一次关机就会卡住不动,现在是多次重复开关机才会死机。虽然这些办法有效果有改善,但是并没有解决问题。

       在这一问题上停滞了2天之后,今天终于找到了解决问题的办法!

       原本串口接收事件中含有invoke来执行委托:Invoke(.............  , ...........);

       这种方式会阻塞当前的线程,会阻塞串口的关闭。

       将invoke改为BeginInvoke来执行委托:BeginInvoke(.............  , ...........);

       就不会出现关闭串口的时候死机、卡住不动的情况了。

用C#编写的wince串口通信程序基本大功告成了,与之前用API函数和线程来做串口通信不同,这次直接使用SerialPort控件来做,原本以为使用控件做会简单和方便许多,没成想,还遇到了很多麻烦。

       通信协议解析判断、控件数据更新显示等等都没有给我造成什么障碍,却偏偏在“关闭串口”这个地方卡壳了。

       在网上看了很多帖子,发现遇到这一问题的人还比较多,按他们的建议和方法都试过了,比如,加close和dataReceive接收标志的方式,或者close之后再Dispose释放资源,或者Application.DoEvents()处理完所有信息再close.............试了能想到的所有办法,最终都试验失败,该死机还是会死机,只是之前,第一次关机就会卡住不动,现在是多次重复开关机才会死机。虽然这些办法有效果有改善,但是并没有解决问题。

       在这一问题上停滞了2天之后,今天终于找到了解决问题的办法!

       原本串口接收事件中含有invoke来执行委托:Invoke(.............  , ...........);

       这种方式会阻塞当前的线程,会阻塞串口的关闭。

       将invoke改为BeginInvoke来执行委托:BeginInvoke(.............  , ...........);

       就不会出现关闭串口的时候死机、卡住不动的情况了。

猜你喜欢

转载自blog.csdn.net/hmdong7/article/details/78372669
今日推荐