2012-07-21 56 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(); 
    })); 
}