1

我正在尝试从 C# 中的串行端口读取值。这是接收到新数据时事件处理程序的代码:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    int bytes = serialPort1.BytesToRead;
    counter = bytes;
    byte[] comBuffer = new byte[bytes];
    serialPort1.Read(comBuffer, 0, bytes);
    this.Invoke(new EventHandler(DisplayText));

}

这是字节应该写入文本框但现在填充测试代码的地方:

private void DisplayText(object sender, EventArgs e)
{
     counter2 += counter;
     RxString = counter2.ToString();
     textBox1.AppendText(RxString + "\r\n");

}

所以我喜欢 C 编程,但不喜欢 C#,如果有人能告诉我如何将byte[]数组放入事件处理程序以对数据进行处理,我将不胜感激。我最大的问题是数组的长度是可变的。

非常感谢!

4

3 回答 3

1

不要使用标准的 EventHandler 签名,而是使用更适合您需要的方法签名:

private void DisplayText(string stringToDisplay)
{
     textBox1.AppendText(stringToDisplay + "\r\n");
}

在您的事件处理程序中,将字节数组转换为字符串并将其传递给您的 DisplayText 方法:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    int bytes = serialPort1.BytesToRead;
    counter = bytes;
    byte[] comBuffer = new byte[bytes];
    serialPort1.Read(comBuffer, 0, bytes);

    // convert byte array to string
    string stringToShow = Encoding.ASCII.GetString(bytes);
    this.Invoke(() => DisplayText(stringToShow));
}

注意:如果您的数据包含 8 位字符(超出 ASCII 范围),请使用适当的编码将其转换为字符串。

于 2014-03-27T19:23:09.030 回答
1

解决问题的正确方法是创建一个派生自 EventArgs 的类和一个使用它的事件处理程序。然后您可以在收到数据时引发此事件。

事件处理程序:

public class MyDataReceivedEventArgs : EventArgs
{
    public byte[] Bytes { get; set; }
}

事件 :

public event EventHandler<MyDataReceivedEventArgs> DataReceived;
private void OnDataReceived(MyDataReceivedEventArgs e)
{
    if(DataReceived != null) DataReceived(this, e);
}

当像这样接收到数据时触发事件:

OnDataReceived(new MyDataReceivedEventArgs { Bytes = comBuffer });
于 2014-03-27T19:23:20.037 回答
1

然后用别的东西EventHandlerEventHandler只需要senderEventArgs因此您需要不同的委托类型。我会使用类似的东西:

private void DisplayText(object sender, DataEventArgs e)
{
     //e.Data is now available

     counter2 += counter;
     RxString = counter2.ToString();
     textBox1.AppendText(RxString + "\r\n");
}

public class DataEventArgs : EventAgrs
{
    public byte[] Data {get; set;}
}

然后使用

byte[] comBuffer = new byte[bytes];
serialPort1.Read(comBuffer, 0, bytes);
this.Invoke(new EventHandler<DataEventArgs>(DisplayText)
          , new DataEventArgs {Data = comBuffer});
于 2014-03-27T19:23:26.570 回答