我注意到我在SerialPort关闭和打开时读取的示例代码,人们会在SerialPort.Open()和Close()之前添加Thread.Sleep(1000)。如下所示:
Thread.Sleep(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();
我无法在任何地方找到任何解释。为什么人们在打开或关闭之前使用Thread.Sleep来阻塞串口?它是出于某种计时目的吗?我是否应该在读取或写入串行端口时放入Thread.Sleep?
答案 0 :(得分:10)
当您打开一个端口时,SerialPort类会启动一个新线程,负责(通过WaitCommEvent Windows API函数)等待串口活动(例如数据到达)并向您的处理程序发送相应的事件。这就是DataReceived等事件实际发生在辅助线程上的原因。
关闭端口时,Close()调用会立即返回,但辅助线程需要一段时间才能停止运行。
如果在调用Close后尝试过快地重新打开端口,并且线程尚未停止运行,则SerialPort实例不会处于可以开始新连接的状态。
请注意MSDN documentation for SerialPort.Close州:
任何应用程序的最佳实践是等待一些 在尝试调用Open之前调用Close方法之后的时间 方法,因为端口可能不会立即关闭。
您可以跟踪关闭端口的时间,再次打开端口之前,请确保已经过了一些任意超时。
在读/写之前无需睡觉,但要记住一些怪癖:
请记住,.NET BCL中的SerialPort类仍然依赖于底层的Win32 API,我认为自从最初的实现以来,它已经得到了很多人的喜爱。
有关详细信息,请参阅:
答案 1 :(得分:3)
每个SerialPort对象只能存在一个打开的连接。任何应用程序的最佳实践是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭。
看看这个link。
答案 2 :(得分:1)
我在C#中完成了一些串行I / O程序,我认为我从未添加过这样的睡眠。我没有经历过任何不良影响(需要注意的是我的应用程序从未试图快速连续打开和关闭串口)
在阅读或写作之前,你绝对不应该睡觉。