我有一个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事件却不起作用?

谢谢,
保罗·H



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

进一步的挫败感:在此设备上,ReadExisting始终返回null,而BytesToRead始终返回0。
但是,ReadLine()Read()都可以正常工作。

最佳答案

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

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

关于c# - 使用DataReceived事件从串行端口读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6474421/

10-10 18:15
查看更多