问题描述
|
我注意到我在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程序,但我认为我从来没有像这样添加过睡眠。我没有遇到任何不良影响(警告:我的应用程序从未尝试过快速连续打开和关闭串行端口)
您绝对不需要在阅读或写作之前就睡觉。