我有一个问题,我在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);
}
}
答案 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;
});
}