2012-07-21 13 views
5

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

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

    } 
+0

私はあなたのサンプルコードを試して、このスレッドに基づいて簡単なC#ソリューションを構築しました。私は私のモデムで 'DataReceived'を読むことができませんでした。私はバランスをチェックするためにwavecomモデムを使用しています。私はそれを修正してください助けてください? – aminvincent

答えて

10

MSDNは、他のスレッドからコントロールのメソッドとプロパティを使用する方法について例を挙げて良いarticleが含まれています。

要するに、指定した文字列でテキストボックスの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});  
} 
+0

それは働いた..おかげでフランク!! – Cdeez

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; 
} 
1

私はUSB COMポートのGUI "フォーム"を作成しています。これは、 "クロススレッド"エラーを出さずにウィンドウにデータを送信する方法です。

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    string inData = serialPort1.ReadLine(); // ReadLine includes the + "\n" 
    displayToWindow(inData); 
} 

private void displayToWindow(string inData) 
{ 
    BeginInvoke(new EventHandler(delegate 
    { 
     richTextBox1.AppendText(inData); 
     richTextBox1.ScrollToCaret(); 
    })); 
} 
関連する問題