我有一个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/