2012-07-21 5 views
5

Ho il seguente codice che richiede che i dati vengano letti dalla porta e quindi visualizzati in una casella di testo. Sto usando il gestore di eventi DataReceived per questo scopo ma non so come visualizzare questi dati nella casella di testo. Da varie fonti ho imparato che il metodo Invoke dovrebbe essere usato per questo, ma non so come usarlo. Suggerimenti per Favore ...Come visualizzare i dati letti nel gestore di eventi DataReceived di 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

Ho provato il codice di esempio e ho creato una semplice soluzione C# basata su questo thread. non riuscivo a leggere 'DataReceived' nel mio modem. Sto usando il modem wavecom per controllare il saldo. Aiutami per favore per risolvere il problema? – aminvincent

risposta

10

MSDN contiene una buona article con esempi sull'utilizzo di metodi e proprietà di controllo da altri thread.

In breve, ciò di cui hai bisogno è un metodo delegato che imposta la proprietà Text della casella di testo con una stringa specifica. Quindi chiama quel delegato dal tuo gestore mySerialPort_DataReceived tramite il metodo TextBox.Invoke(). Qualcosa del genere:

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

Ha funzionato .. Grazie sincero !! – Cdeez

2

Prova questo (funziona per me):

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

Sto creando una "forma" GUI per porte COM USB. Ecco come invio i dati alla finestra senza ottenere un errore "Cross-Thread".

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