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");

}

byte[]したがって、私は C プログラミングには興味がありますが、C#には興味がありません。データを処理するために配列をイベント ハンドラーに入れる方法を誰かが教えてくれたらとてもありがたいです。私の最大の問題は、配列の長さが可変であることです。

どうもありがとう!

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のみを取るsenderためEventArgs、別のデリゲート タイプが必要です。私は次のようなものを使用します:

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 に答える