2012-07-21 9 views
5

lesen anzuzeigen habe ich den folgenden Code, der die Daten muss von Port gelesen werden und dann in einem Textfeld angezeigt werden soll. Ich benutze den DataReceived-Event-Handler für diesen Zweck, weiß aber nicht, wie ich diese Daten im Textfeld anzeigen kann. Aus verschiedenen Quellen habe ich gelernt, dass die Invoke-Methode dafür verwendet werden sollte, aber nicht wissen, wie man sie benutzt. Bitte Vorschläge ...Wie die Daten in DataReceived Ereignishandler von 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

Ich habe Ihren Beispielcode ausprobiert und einfache C# -Lösung basierend auf diesem Thread erstellt. Ich konnte "DataReceived" in meinem Modem nicht lesen. Ich verwende das Wavecom-Modem, um das Guthaben zu prüfen. Hilf mir bitte, es zu reparieren? – aminvincent

Antwort

10

Die MSDN enthält eine gute article mit Beispielen über Kontrollverfahren unter Verwendung und Eigenschaften von anderen Threads.

Kurz gesagt, was Sie brauchen, ist eine delegierte Methode, die die Text Eigenschaft Ihres Textfeld mit einer bestimmten Zeichenfolge setzt. Sie rufen dann die Delegierten in Ihrem mySerialPort_DataReceived Handler über die TextBox.Invoke() Methode. Etwas wie folgt aus:

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

Es hat funktioniert .. Danke Frank !! – Cdeez

2

Versuchen Sie, diese (für mich funktioniert):

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

Ich bin eine GUI "Form" für USB-COM-Anschlüsse zu schaffen. So sende ich Daten an das Fenster, ohne einen "Cross-Thread" -Fehler zu bekommen.

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