背景C#中的串口侦听器

时间:2017-06-06 07:07:05

标签: c# forms serial-port console-application background-process

我有一个问题,我在C#中构建一个表单应用程序,但我不是很好。 我想在窗体中添加一个新功能,在后台监听串口,然后在文本框中显示收到的数据,这样做必须花费很长时间才能运行。

我找到了一些代码来说明如何为控制台应用程序执行此操作,但现在我想更改代码以便我可以在表单中使用它,任何人都可以帮助我吗?

using System;
using System.IO.Ports;

class PortDataReceived
{
    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM8");

        mySerialPort.BaudRate = 57600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }

    private static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
}

2 个答案:

答案 0 :(得分:0)

将串口初始化代码放入表单的Shown事件处理程序中,将DataReceived事件处理程序代码复制到表单类中而不是写入控制台,将数据放入一个文本框左右。

请注意,DataReceived处理程序将在单独的线程上调用,因此您需要调用this.Invoke来执行在UI线程上更新UI的代码。否则你会得到一个例外。

答案 1 :(得分:0)

您可以使用方法调用者委托并在DataRecieved事件中设置文本。

示例:

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();

    this.Invoke((MethodInvoker)delegate
    { 
        textBox.Text += indata; 
    });  
}