2012-07-21 10 views
5

Mam następujący kod, który potrzebuje danych do odczytania z portu, a następnie wyświetlić w polu tekstowym. Używam programu obsługi zdarzeń DataReceived do tego celu, ale nie wiem jak wyświetlić te dane w polu tekstowym. Z różnych źródeł dowiedziałem się, że należy użyć metody Invoke, ale nie wiem, jak z niej korzystać. Propozycje proszę ...Jak wyświetlić dane odczytane w module obsługi zdarzeń DataReceived portu szeregowego

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

Próbowałem twój próbny kod i budować proste rozwiązanie C# oparte na tym wątku. nie mogłem odczytać 'DataReceived' w moim modemie. Używam modemu wavecom do sprawdzenia salda. Pomóż mi to naprawić? – aminvincent

Odpowiedz

10

MSDN zawiera dobrą article z przykładów na temat korzystania z metod i właściwości sterujących z innych wątków.

W skrócie, potrzebna jest metoda delegata, która ustawia właściwość Text w polu tekstowym z danym ciągiem znaków. Następnie wywołujesz tego delegata z poziomu swojego operatora mySerialPort_DataReceived za pomocą metody TextBox.Invoke(). Coś takiego:

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

Udało się .. Dzięki, Frank! – Cdeez

2

Spróbuj tego (działa dla mnie):

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

Tworzę GUI "Form" dla portów COM USB. W ten sposób wysyłam dane do okna bez otrzymania błędu "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(); 
    })); 
} 
Powiązane problemy