为什么在SerialPort.Open和Close之前使用Thread.Sleep?

问题描述

| 我注意到我在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()调用立即返回,但是辅助线程需要一些时间来旋转。 如果您在调用“关闭”后尝试过快重新打开端口,并且线程尚未启动,则SerialPort实例不会处于可以开始新连接的状态。 请注意MSDN文档中的SerialPort.Close状态:   任何应用程序的最佳做法是等待一定数量的   调用Close方法之后的时间,然后再尝试调用Open   方法,因为端口可能不会立即关闭。 您可以跟踪关闭端口的时间,并在再次打开端口之前确保已经历了任意超时。 尽管需要记住一些怪癖,但在读/写之前无需睡觉。 读取返回的字节数少于您要求的字节数 有时DataReady事件不会触发 ReadTimeout可能有问题 请记住,.NET BCL中的SerialPort类仍然依赖于基础Win32 API,我认为自最初实现以来,它并没有受到Microsoft的广泛欢迎。 有关更多信息,请参见: http://www.innovatic.dk/knowledg/SerialCOM/SerialCOM.htm#SerialPortEvents http://social.msdn.microsoft.com/Forums/zh-CN/netfxbcl/thread/f334ecce-eca3-46fd-8b65-27c02a1d4fea#10dae30d-bc75-49bb-a669-79399e58e1cc SerialPort类有时挂在Dispose上     ,        每个SerialPort对象只能存在一个打开的连接。对于任何应用程序,最佳做法是在调用Close方法之后等待尝试调用Open方法之前等待一段时间,因为端口可能不会立即关闭。 看一下这个链接。     ,        我已经用C#完成了一些串行I / O程序,但我认为我从来没有像这样添加过睡眠。我没有遇到任何不良影响(警告:我的应用程序从未尝试过快速连续打开和关闭串行端口) 您绝对不需要在阅读或写作之前就睡觉。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...