我注意到我在 SerialPort 关闭和打开时读到的示例代码,人们会在 SerialPort.Open() 和 Close() 之前添加 Thread.Sleep(1000)。就像下面这样:
Thread.Sleep(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();
我在任何地方都找不到任何解释。为什么人们在串口打开或关闭之前使用 Thread.Sleep 来阻塞它?是出于某种计时目的吗?每当我读取或写入串行端口时,我是否应该放置 Thread.Sleep ?
当您打开端口时,SerialPort 类会在后台启动一个新线程,该线程负责(通过 WaitCommEvent Windows API 函数)等待串行端口活动(例如数据到达)并向处理程序触发适当的事件。这就是为什么像 DataReceived 这样的事件实际上发生在辅助线程上。
当您关闭端口时,Close() 调用会立即返回,但辅助线程需要一些时间才能停止运行。
如果您在调用 Close 之后尝试过快地重新打开端口,并且线程尚未停止旋转,则 SerialPort 实例不处于可以开始新连接的状态。
请注意SerialPort.Close 的 MSDN 文档 http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.close.aspx states:
对于任何应用程序来说,最佳实践是等待一定时间
调用 Close 方法之后尝试调用 Open 之前的时间
方法,因为端口可能不会立即关闭。
您可以跟踪关闭端口的时间,并在再次打开端口之前确保已过了某个任意超时。
尽管需要记住一些怪癖,但在读/写之前不需要睡觉:
- 读取返回的字节数少于您要求的字节数
- 有时 DataReady 事件不会触发
- ReadTimeout 可能有问题 http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/dc8f858c-8f6f-4184-aac6-02ac88dc5e77/
请记住,.NET BCL 中的 SerialPort 类仍然依赖于底层 Win32 API,并且我认为自最初实现以来它并没有得到 Microsoft 的太多喜爱。
欲了解更多信息,请参阅:
http://www.innovatic.dk/knowledg/SerialCOM/SerialCOM.htm#SerialPortEvents http://www.innovatic.dk/knowledg/SerialCOM/SerialCOM.htm#SerialPortEvents
http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f334ecce-eca3-46fd-8b65-27c02a1d4fea#10dae30d-bc75-49bb-a669-79399e58e1cc http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f334ecce-eca3-46fd-8b65-27c02a1d4fea#10dae30d-bc75-49bb-a669-79399e58e1cc
SerialPort 类偶尔会挂在 Dispose 上 https://stackoverflow.com/questions/10209090/serialport-class-occasionally-hangs-on-dispose
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)