【问题标题】:Serial Port object's DataReceived Event firing twice串行端口对象的 DataReceived 事件触发两次
【发布时间】:2015-05-18 06:12:33
【问题描述】:

我正在使用 Visual C# 2010 windows 窗体应用程序串行端口 对象 在串行端口上接收 十六进制数据 字节。
但是,我意识到我的 DataReceived 事件被触发了两次,即使我已经读取了缓冲区中的所有数据字节并且缓冲区显示要读取的 0 字节。
为什么以及如何发生这种情况?

private void PortData(Object Sender,     System.IO.Ports.SerialDataReceivedEventArgs e)
{
    this.Invoke(new EventHandler(delegate { DisplayText(); }));
}

Private void DisplayText()
{
    int dataLength = serialPort1.BytesToRead;
    byte[] data = new byte[dataLength];
    serialPort1.Read(data, 0, dataLentgh)
}

我在串行端口上发送 8 个十六进制字节,即 FF FF FB FB FB FF FB,这些字节由读取函数在数据数组中接收。但在这之后 第二次调用 PortData 函数以读取 0 个字节。我不希望它第二次调用。

【问题讨论】:

  • 欢迎来到 StackExchange!这对于第一个问题来说非常好——如果您提及您正在使用的实际命名空间和类名,您的问题将更容易回答(因此更有可能吸引答案),并且将来也更容易找到。如果您链接到参考手册并引用您遇到问题的部分,那就更好了。
  • 可能有几个原因(也许它在您读取字节之前被触发) - 您可以显示您的代码吗?也许我们可以帮你解决这个问题(因为它真的应该没有问题)
  • private void PortData(Object Sender, System.IO.Ports.SerialDataReceivedEventArgs e) { this.Invoke(new EventHandler(delegate { DisplayText(); })); } Private void DisplayText() { int dataLength = serialPort1.BytesToRead;字节[]数据=新字节[数据长度]; serialPort1.Read(data, 0, dataLentgh) } 我在串行端口上发送 8 个十六进制字节,即 FF FF FB FB FB FF FB,这些字节由读取函数在数据数组中接收。但是在第二次调用此 PortData 函数以读取 0 个字节之后。我不希望它第二次调用。
  • 请编辑您的问题并将代码放在那里-评论中绝对不可读-您还检查了汉斯在下面给您的答案吗?
  • 在它之上 - DisplayText 似乎不显示文本 - 它似乎从端口读取数据,所以它似乎真的是 misnamed 加上你应该这样做事件本身;)

标签: c# winforms serial-port


【解决方案1】:

当您收到二进制数据时,这是完全正常的。忘记检查e.EventType 属性是一个标准错误。每当您收到 0x1A 字节值(文件结尾字符)时,都会引发该事件。无法设置 EOF 字符或完全禁用它是一个疏忽。你只能忽略它们:

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) {
        if (e.EventType == System.IO.Ports.SerialData.Eof) return;
        // Rest of code
        //...
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多