C#SerialPort DataReceived事件

C#SerialPort DataReceived事件,c#,C#,我正在收听一个串行端口的5字节信息。投票的完整答案需要5个字节。我的代码侦听serialport数据_接收到的事件并检查bytesToRead。有时,事件将触发,bytesToRead为0。事件不是只有在数据可用时才触发吗 public SerialPort wheel = new SerialPort(); public void wheel_DataReceived(object sender, EventArgs e) { if (wheel.BytesToRead < 5)

我正在收听一个串行端口的5字节信息。投票的完整答案需要5个字节。我的代码侦听serialport数据_接收到的事件并检查bytesToRead。有时,事件将触发,bytesToRead为0。事件不是只有在数据可用时才触发吗

public SerialPort wheel = new SerialPort();
public void wheel_DataReceived(object sender, EventArgs e)
{
    if (wheel.BytesToRead < 5)
    {
        wheelRetry += 1;
        Log("Wheel Data Received: " + wheel.BytesToRead.ToString() + 
            " bytes. Need 5 bytes. Attempt #: " + wheelRetry.ToString());
    }
public SerialPort wheel=new SerialPort();
已接收公共无效数据(对象发送方、事件参数e)
{
如果(车轮直径小于5)
{
平均值+=1;
日志(“接收到的控制盘数据:”+Wheel.BytesToRead.ToString()+
“字节。需要5个字节。尝试:”+wheelRetry.ToString());
}

您可以设置
ReceivedBytesThreshold
属性:

var port = new SerialPort();
port.Open();    

//Only raise the event if 5 bytes have been received
port.ReceivedBytesThreshold = 5;

port.DataReceived += (s, e) =>
{
    //Handle the data
};
请注意,您应该在打开端口后连接事件处理程序,
这是为了防止某些平台出现已知问题,从而阻止事件发生
根据,是的,当
BytesToRead
为0时,
DataReceived
事件可以触发,如果内部流的
DataReceived
事件触发,并且事件args具有
EventType==SerialData.Eof
,则大小不考虑按TestOread执行的

内部流的
DataReceived
事件处理程序中的相关片段:

bool raiseEvent = false;
try {
    raiseEvent = stream.IsOpen && (SerialData.Eof == e.EventType || BytesToRead >= receivedBytesThreshold);    
}
catch {
    // Ignore and continue. SerialPort might have been closed already! 
}
finally {
    if (raiseEvent)
        eventHandler(this, e);  // here, do your reading, etc. 
}
您可以按照@elgonzo的建议修改事件处理程序,以便检查
EventType

public void wheel_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if(e.EventType == SerialData.Eof) //return? possibly nothing to read
...

首先,您不检查SerialData事件类型(作为
SerialDataReceivedEventArgs
的一部分传递)(提示:更改事件处理程序以匹配委托类型
System.IO.Ports.SerialDataReceiveDevenHandler
,以便在不需要强制转换的情况下更轻松地处理事件参数。)检查您是否获得
SerialData.Chars
SerialData.Eof
事件类型…可能您在使用XonXoff握手时还受到最后一个字节为0x13的问题的影响。检查此情况是否适用于您。如果是,您还将在那里找到解决方法。。。