6

ポートからデータを読み取ってテキストボックスに表示する必要がある次のコードがあります。この目的で DataReceived イベント ハンドラを使用していますが、このデータをテキスト ボックスに表示する方法がわかりません。さまざまな情報源から、これには Invoke メソッドを使用する必要があることを知りましたが、使用方法がわかりません。提案してください...

    private void Form1_Load(object sender, EventArgs e)
    {
        //SerialPort mySerialPort = new SerialPort("COM3");
        mySerialPort.PortName = "COM3";
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived);
        mySerialPort.Open();
    }

    private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string s= sp.ReadExisting();
        // next i want to display the data in s in a textbox. textbox1.text=s gives a cross thread exception
    }
    private void button1_Click(object sender, EventArgs e)
    {

        mySerialPort.WriteLine("AT+CMGL=\"ALL\"");

    }
4

3 に答える 3

13

MSDNには、他のスレッドからの制御メソッドとプロパティの使用に関する例を含む優れた記事が含まれています。

つまり、必要なのは、Textテキストボックスのプロパティを特定の文字列に設定するデリゲートメソッドです。mySerialPort_DataReceived次に、メソッドを介してハンドラー内からそのデリゲートを呼び出しますTextBox.Invoke()。このようなもの:

public delegate void AddDataDelegate(String myString);
public AddDataDelegate myDelegate;

private void Form1_Load(object sender, EventArgs e)
{
    //...
    this.myDelegate = new AddDataDelegate(AddDataMethod);
}

public void AddDataMethod(String myString)
{
    textbox1.AppendText(myString);
}

private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   SerialPort sp = (SerialPort)sender;
   string s= sp.ReadExisting();

   textbox1.Invoke(this.myDelegate, new Object[] {s});       
}
于 2012-07-21T09:45:43.047 に答える
2

これを試してください(私にとってはうまくいきます):

private delegate void UpdateUiTextDelegate(string text);

private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    if (mySerialPort.IsOpen)
    {
        RxString = mySerialPort.ReadLine();
        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), RxString);
    }
}

private void DisplayText(string RxString)
{
    myTextBox.Text = RxString;
}
于 2012-07-21T09:36:28.630 に答える