我有一个自动检测线程,它尝试按顺序打开端口并匹配接收到的数据,从而检测相关设备发送数据的端口。现在,在某些端口上,SerialPort.Open 只是将线程挂起约 30 秒。如何在 SerialPort.Open 函数上设置超时?
来自MSDN
每个 SerialPort 对象只能存在一个打开的连接。
任何应用程序的最佳实践是在调用 Close 方法之后等待一段时间,然后再尝试调用 Open 方法,因为端口可能不会立即关闭。
当您调用 Close() 时,该工作线程需要时间来旋转并退出。 所需时间未指定,您无法验证是否已完成。 您所能做的就是在再次调用 Open() 之前等待至少一秒钟。
我遇到了同样的问题,希望我的解决方案可以帮助你。
您可以在单独的线程中检测串行端口,该线程将在 500 毫秒后中止。
// the Serial Port detection routine
private void testSerialPort(object obj)
{
if (! (obj is string) )
return;
string spName = obj as string;
SerialPort sp = new SerialPort(spName);
try
{
sp.Open();
}
catch (Exception)
{
// users don't want to experience this
return;
}
if (sp.IsOpen)
{
if ( You can recieve the data you neeed)
{
isSerialPortValid = true;
}
}
sp.Close();
}
// validity of serial port
private bool isSerialPortValid;
// the callback function of button checks the serial ports
private void btCheck(object sender, RoutedEventArgs e)
{
foreach (string s in SerialPort.GetPortNames())
{
isSpValid = false;
Thread t = new Thread(new ParameterizedThreadStart(testSerialPort));
t.Start(s);
Thread.Sleep(500); // wait and trink a tee for 500 ms
t.Abort();
// check wether the port was successfully opened
if (isSpValid)
{
textBlock1.Text = "Serial Port " + s + " is OK !";
}
else
{
textBlock1.Text = "Serial Port " + s + " did not open!";
}
}
}
}
可以将可能的改进添加到解决方案中。您可以使用多线程来加速进程,并使用
ProgressBar
来清晰地显示进度。
将其添加到您的代码中:
commPort = new SerialPort();
commPort.ReadTimeout = 1000000;
commPort.WriteTimeout = 1000000;
我建议你看看SerialPort.Open方法
如果我理解正确的话,即使发生超时,您也希望从串口读取数据。
如果是这样,那么您应该捕获 TimeoutException 并继续循环。例如MSDN 代码
public static void Read()
{
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
Console.WriteLine(message);
}
catch (TimeoutException) { }
}
}