在读取循环中检查SerialPort.BytesToRead vs使用TimeoutException?

时间:2013-02-18 10:18:39

标签: c# .net serial-port timeoutexception

我有一个.NET C#类,它使用System.IO.Ports.SerialPort进行串口通信。它包括一个在循环中连续读取串行端口的线程。

我一直认为使用Exceptions作为正常程序流程的一部分很糟糕,但是在网上搜索我看到很多使用阻塞Read和TimeoutException来等待传入数据的例子,如下所示:

while (true)
{
    try
    {
        serialPort.Read(buffer, offset, count);
        /* Processing code here */
    }
    catch (TimeoutException)
    { }
}

在发出SerialPort.BytesToRead()之前检查Read不是更好,就像在这个例子中一样:

while (true)
{
    if (serialPort.BytesToRead() <= 0)
    {
        /* Wait for event signal or similar. */
    }

    serialPort.Read(buffer, offset, count);
    ProcessData();
}

2 个答案:

答案 0 :(得分:1)

第二种方法肯定更好。 异常不应用于控制正常程序流程。

此外,第一种方法会使您的调试体验变得混乱,特别是如果您将IDE设置为在每个抛出的异常中中断。

答案 1 :(得分:-1)

不要读端口,你有一个特殊的功能:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
     int n = serialPort1.BytesToRead;
     ...
}