2017-02-19 18 views
0

我目前正在研究一个C#应用程序,并通过USB端口读取串行数据发送,这些数据将显示在文本框中,然后最终显示到数据库中。我现在所拥有的代码会刷新以读取每2秒钟发送一次的串行数据,但我无法将数据获取到文本框中。我对C#开发相当陌生,所以我不确定将数据输出到文本框或如何解决我的问题的最佳方式。我的代码如下。如何将通过串口发送的数据输出到文本框? C#Visual Studio

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) 
    { 

    } 
} 

回答

0

事件DataReceived与方法DataReceivedHandler在不同的线程比创建textBox1控制处理。所以在运行你的程序时你应该得到一个System.InvalidOperationException。其中恰恰说明了我刚刚描述的内容。

为了摆脱这种困境,你可以使用Control.BeginInvoke方法将:

异步执行指定委托该控件的基础句柄创建线程上。

基本上它会将这段代码拖到创建控件的线程。在这种情况下,主线程。这是你将如何使用它:

//writes to text box 
textBox1.BeginInvoke(new Action(() => { textBox1.Text = data; })); 

我希望它有帮助。

+0

谢谢!有用! – Miggy

相关问题