读取带有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()
都能很好地工作。
不要在接收到的数据处理程序中放入阻塞读取。如果处理程序触发并且没有整行要读取,它将被阻塞。在你发布的代码中,没有任何形式的阅读。
来自MSDN:"PinChanged、DataReceived和ErrorReceived事件可能被无序调用,在底层流报告错误和执行事件处理程序之间可能会有轻微延迟。一次只能执行一个事件处理程序。"