使用DataReceived事件从串行端口读取

时间:2011-06-24 22:32:46

标签: c# serial-port

我有一个Visual Studio 2008 C#.net 2.0 CF应用程序,它使用System.IO.Ports.SerialPort类从串行端口读取。不幸的是,SerialDataReceivedEventHandler永远不会被调用。

我打开这样的端口:

private SerialPort serial_port_;
protected void OpenSerialPort(string port, int baud)
{
    if (serial_port_ == null)
    {
        serial_port_ = new SerialPort(port,
                                  baud,
                                  Parity.None,
                                  8,
                                  StopBits.One);
    }
    else
    {
        serial_port_.BaudRate = baud;
        serial_port_.PortName = port;
    }

    if (!serial_port_.IsOpen)
    {
        serial_port_.Open();
        serial_port_.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
    }
}

private void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args)
{
    Debug.WriteLine("Serial data received");
}

但是,如果我在端口打开后立即添加Debug.WriteLine(serial_port_.ReadLine());,我会在输出窗口中看到来自端口的文本行,就像我期望的那样。

那么,为什么ReadLine有效,但DataReceived事件不起作用?

谢谢, PaulH


编辑:进一步测试显示此代码适用于某些设备,但不适用于其他设备。 DataReceived事件需要什么才能正常工作?

进一步挫败:在此设备上,ReadExisting始终返回null,BytesToRead始终返回0。 不过,ReadLine()Read()都很完美。

1 个答案:

答案 0 :(得分:2)

不要在数据接收处理程序中放置阻塞读取。如果处理程序触发并且没有要读取的整个,它将阻止。在您发布的代码中,没有任何类型的阅读。

来自MSDN:“PinChanged,DataReceived和ErrorReceived事件可能无序调用,并且在基础流报告错误和执行事件处理程序之间可能会有一点延迟。只有一个事件处理程序可以一次执行。