[英]How to display data received from serial port in a textbox without the text disappearing in Visual Studio C#?
[英]How to output data sent through serial port onto a textBox? C# Visual Studio
我目前正在使用C#应用程序,并且在其中读取通过USB端口发送的串行数据,该数据将在文本框中显示,然后最终存储到数据库中。 我现在拥有的代码可以刷新以读取每2秒传入的串行数据,但是我无法将数据获取到textBox上。 我对C#开发还很陌生,所以我不确定将数据输出到文本框的最佳方法是什么,或者首先如何解决问题。 我的代码如下。
public partial class Form1 : Form
{
SerialPort mySerialPort = new SerialPort("COM3");
OleDbConnection connection = new OleDbConnection();
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.RtsEnable = true;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
if (mySerialPort.IsOpen == false)
{
mySerialPort.Open();
}
}
public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
//gets data values from serial port
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
string time = GetTimestamp(DateTime.Now);
int indata;
long timeStamp;
//parses strings to integers
indata = Int32.Parse(data);
timeStamp = Int64.Parse(time);
//writes to console
Console.WriteLine(indata);
Console.WriteLine(timeStamp);
//writes to text box
textBox1.Text = data;
Thread.Sleep(2000);
}
private void button3_Click(object sender, EventArgs e)
{
mySerialPort.Close();
}
private void label1_Click(object sender, EventArgs e)
{
}
public static string GetTimestamp(DateTime value)
{
return value.ToString("yyyyMMddHHmmss");
}
private void label1_Click_1(object sender, EventArgs e)
{
}
}
使用方法DataReceivedHandler
在与创建控件textBox1
不同的线程上处理DataReceived
事件。 因此,在运行程序时,您应该获得System.InvalidOperationException
。 哪一个正是我刚才所描述的。
为了摆脱这种困境,您可以使用Control.BeginInvoke方法,该方法将:
在创建控件的基础句柄的线程上异步执行指定的委托。
基本上,它将代码段拖到创建控件的线程中。 在这种情况下,主线程。 这是您将如何使用它:
//writes to text box
textBox1.BeginInvoke(new Action(() => { textBox1.Text = data; }));
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.