2012-07-21 57 views
5

的DataReceived事件檢索處理程序讀出的數據我已經從端口閱讀下面的代碼所需要的數據,然後在文本框顯示。我使用DataReceived事件檢索處理程序用於此目的,但DONOT知道如何顯示在文本框此數據。從各種渠道我瞭解到,Invoke方法應該用於這一點,但DONOT知道如何使用它。建議請...如何顯示的serialport中

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 2015-09-14 03:20:46

回答

10

的MSDN包含了一個很好article有關使用其他線程的控制方法和屬性的例子。

總之,你需要的是你的設置文本框的Text屬性與給定的字符串的委託方法。然後,通過TextBox.Invoke()方法調用委託從mySerialPort_DataReceived處理程序中。像這樣:

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 2012-07-21 11:22:44

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(); 
    })); 
}