读取带有DataReceived事件的串行端口

本文关键字:串行端口 事件 DataReceived 读取 | 更新日期: 2023-09-27 18:00:26

我有一个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()都能很好地工作。

读取带有DataReceived事件的串行端口

不要在接收到的数据处理程序中放入阻塞读取。如果处理程序触发并且没有整行要读取,它将被阻塞。在你发布的代码中,没有任何形式的阅读。

来自MSDN:"PinChanged、DataReceived和ErrorReceived事件可能被无序调用,在底层流报告错误和执行事件处理程序之间可能会有轻微延迟。一次只能执行一个事件处理程序。"