How to display the data read in DataReceived event handler of serialport

后端 未结 3 607
一个人的身影
一个人的身影 2020-12-05 08:42

I have the following code which needs the data to be read from port and then display in a textbox. I am using DataReceived event handler for this purpose but donot know how

相关标签:
3条回答
  • 2020-12-05 09:39

    Try this (works for 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;
    }
    
    0 讨论(0)
  • 2020-12-05 09:42

    I'm creating a GUI "Form" for USB COM Ports. This is how I send data to the window without getting a "Cross-Thread" error.

    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();
        }));
    }
    
    0 讨论(0)
  • 2020-12-05 09:45

    The MSDN contains a good article with examples about using control methods and properties from other threads.

    In short, what you need is a delegate method that sets the Text property of your text box with a given string. You then call that delegate from within your mySerialPort_DataReceived handler via the TextBox.Invoke() method. Something like this:

    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 讨论(0)
提交回复
热议问题