C#:SerialPort.Open 超时?

问题描述 投票:0回答:4

我有一个自动检测线程,它尝试按顺序打开端口并匹配接收到的数据,从而检测相关设备发送数据的端口。现在,在某些端口上,SerialPort.Open 只是将线程挂起约 30 秒。如何在 SerialPort.Open 函数上设置超时?

c# serial-port
4个回答
6
投票

来自MSDN
每个 SerialPort 对象只能存在一个打开的连接。

任何应用程序的最佳实践是在调用 Close 方法之后等待一段时间,然后再尝试调用 Open 方法,因为端口可能不会立即关闭。

当您调用 Close() 时,该工作线程需要时间来旋转并退出。 所需时间未指定,您无法验证是否已完成。 您所能做的就是在再次调用 Open() 之前等待至少一秒钟。


4
投票

我遇到了同样的问题,希望我的解决方案可以帮助你。

您可以在单独的线程中检测串行端口,该线程将在 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
来清晰地显示进度。


1
投票

将其添加到您的代码中:

commPort = new SerialPort();

commPort.ReadTimeout = 1000000;
commPort.WriteTimeout = 1000000;

我建议你看看SerialPort.Open方法


1
投票

如果我理解正确的话,即使发生超时,您也希望从串口读取数据。

如果是这样,那么您应该捕获 TimeoutException 并继续循环。例如MSDN 代码

public static void Read()
{
    while (_continue)
    {
        try
        {
            string message = _serialPort.ReadLine();
            Console.WriteLine(message);
        }
        catch (TimeoutException) { }
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.