我有一个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()
都很完美。
答案 0 :(得分:2)
不要在数据接收处理程序中放置阻塞读取。如果处理程序触发并且没有要读取的整个行,它将阻止。在您发布的代码中,没有任何类型的阅读。
来自MSDN:“PinChanged,DataReceived和ErrorReceived事件可能无序调用,并且在基础流报告错误和执行事件处理程序之间可能会有一点延迟。只有一个事件处理程序可以一次执行。“