我注意到我在SerialPort关闭和打开时读取的示例代码,人们会在SerialPort.Open()和Close()之前添加Thread.Sleep(1000).如下:
Thread.Sleep(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();
我在任何地方都找不到任何解释.为什么人们在打开或关闭之前使用Thread.Sleep来阻塞串口?它是出于某种计时目的吗?我是否应该在读取或写入串行端口时放入Thread.Sleep?
rka*_*rer 10
当您打开一个端口时,SerialPort类会启动一个新线程,负责(通过WaitCommEvent Windows API函数)等待串口活动(例如数据到达)并向您的处理程序发送相应的事件.这就是DataReceived之类的事件实际发生在辅助线程上的原因.
当您关闭端口时,Close()调用立即返回,但辅助线程需要一些时间才能减速.
如果在调用Close后尝试重新打开端口太快,并且线程尚未停止,则SerialPort实例不处于可以开始新连接的状态.
任何应用程序的最佳实践是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭.
您可以跟踪何时关闭端口,并在再次打开它之前确保已经过了一些任意超时.
在读/写之前不需要睡觉,尽管要记住一些怪癖:
请记住,.NET BCL中的SerialPort类仍然依赖于底层的Win32 API,我认为自从最初的实现以来,它已经得到了很多微软的喜爱.
有关更多信息,请参阅
| 归档时间: | 
 | 
| 查看次数: | 5081 次 | 
| 最近记录: |