簡體   English   中英

C#在文本框中顯示變量

[英]C# display a variable in a Textbox

我正在將NUCLEOF411RE的傳感器信息發送到我的PC。 我通過BaudRate為115200在COM98上接收到此數據。現在,我想對Windows應用程序進行編程,該應用程序將拆分字符串並將其放在文本框中。 到現在為止,我使用Button_click事件顯示數據。 它會將值實際放在實際的真實值上。 但是,如果我移動Sensor並再次單擊按鈕,則應該有更多不同的值,但是文本框中的值相同。 另外,我想自動刷新文本框,而不是單擊按鈕。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace BNO080
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            getAvailablePorts();
        }

    public string comport;
    SerialPort serial = new SerialPort();


    void getAvailablePorts()
    {
        String[] ports = SerialPort.GetPortNames();
        comboBox1.Items.AddRange(ports);
        comport = comboBox1.Text;
    } 

    private void button1_Click(object sender, EventArgs e)
    {   

        try
        {   
            if(comboBox1.Text=="" || textBox6.Text=="")
            {
                MessageBox.Show("Please Select Port Settings");
            }
            else
            {

                serial.PortName = comboBox1.Text;
                serial.BaudRate = Convert.ToInt32(textBox6.Text);
                serial.Parity = Parity.None;
                serial.StopBits = StopBits.One;
                serial.DataBits = 8;
                serial.Handshake = Handshake.None;
                serial.Open();

                MessageBox.Show("connected!");
            }
         }
        catch (UnauthorizedAccessException)
        {
            MessageBox.Show("Unauthorised Access");
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {

        textBox1.Clear();
        textBox2.Clear();
        textBox3.Clear();
        textBox4.Clear();
        textBox5.Clear();
        MessageBox.Show("connection closed!");
        serial.Close();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        try
        {

            textBox5.Text = serial.ReadLine();
              /*String[] Stringsizes = A.Split(new char[] {' '});
              textBox1.Text = Stringsizes[0];
              textBox2.Text = Stringsizes[1];
              textBox3.Text = Stringsizes[2];
              textBox4.Text = Stringsizes[3];*/
             // textBox5.Text = A;
            //Array.Clear(Stringsizes, 0, 3);



        }
        catch (Exception) { }
    }     
}
}

有人能幫我嗎?

您能否提供更多信息,為什么使用Button_Click事件讀取文本? 也許這是您訂閱COM端口的DataReceived-Event的一種可能方法? 它看起來像這樣:

serial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    string receivedString = serial.ReadExisting();
//Do something here...
}

我會做幾件事。 首先訂閱串行端口上的DataReceived事件。 當串行端口上有可用數據時,將調用此事件處理程序。 然后,在事件處理程序中,您可以從串行端口讀取並將其添加到文本框中。 您不能直接添加它(請參閱AppendText函數),因為事件處理程序是通過不同的線程調用的,只有UI線程可以更新UI組件(否則您將獲得跨線程異常)。

...
public Form1()
{
  InitializeComponent();

  getAvailablePorts();
  // Subscribe to the DataReceived event.  Our function Serial_DataReceived
  // will be called whenever there's data available on the serial port.
  serial.DataReceived += Serial_DataReceived;
}

// Appends the given text to the given textbox in a way that is cross-thread
// safe.  This can be called by any thread, not just the UI thread.
private void AppendText(TextBox textBox, string text)
{
  // If Invoke is required, i.e. we're not running on the UI thread, then
  // we need to invoke it so that this function gets run again but on the UI
  // thread.
  if (textBox.InvokeRequired)
  {
    textBox.BeginInvoke(new Action(() => AppendText(textBox, text)));
  }
  // We're on the UI thread, we can append the new text.
  else
  {
    textBox.Text += text;
  }
}

// Gets called whenever we receive data on the serial port.
private void Serial_DataReceived(object sender,
  SerialDataReceivedEventArgs e)
{
  string serialData = serial.ReadExisting();
  AppendText(textBox5, serialData);
}

因為我想添加旋轉的3D立方體,所以我決定切換到WPF。 我聽說在那里實現3D圖形要容易得多。 所以我將代碼復制到新的WPF項目中。 但是現在我已經無法在文本框上顯示我的值了。 它不起作用。 從COM端口接收數據時,Evenhandler似乎沒有觸發事件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Drawing;


namespace cube
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            getAvailablePorts();
            serial.DataReceived += Serial_DataReceived;
        }

    public bool button3clicked = false;
    public bool button4clicked = false;
    public bool button5clicked = false;
    SerialPort serial = new SerialPort();

    void getAvailablePorts()
    {            
        List<string> Itemlist = new List<string>();
        String[] ports = SerialPort.GetPortNames();
        Itemlist.AddRange(ports);
        comboBox1.ItemsSource = Itemlist;            
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        try
        {
            if (comboBox1.Text == "" || textBox6.Text == "")
            {
                MessageBox.Show("Please Select Port Settings");
            }
            else
            {
                serial.PortName = comboBox1.Text;
                serial.BaudRate = Convert.ToInt32(textBox6.Text); 
                serial.Parity = Parity.None;
                serial.StopBits = StopBits.One;
                serial.DataBits = 8;
                serial.Handshake = Handshake.None;
                serial.Open();
                MessageBox.Show("connected!");
            }
        }
        catch (UnauthorizedAccessException)
        {
            MessageBox.Show("Unauthorised Access");
        }
    }

    private void button2_Click_1(object sender, EventArgs e)
    {
        textBox1.Clear();
        textBox2.Clear();
        textBox3.Clear();
        textBox4.Clear();
        textBox5.Clear();
        MessageBox.Show("connection closed!");
        serial.Close();
        textBox1.Text = "test";
    }

    private void AppendText(string[] text)
    {
        try
        {             
                textBox1.Text = text[0];
                textBox2.Text = text[1];
                textBox3.Text = text[2];
                textBox4.Text = text[3];                
        }
        catch (Exception) { }
    }

    private void Safe_Position1(TextBox tBr1, TextBox tBi1, TextBox tBj1, TextBox tBk1, string[] text)
    {
        if (button3clicked == true)
        {               
                tBr1.Text = text[0];
                tBi1.Text = text[1];
                tBj1.Text = text[2];
                tBk1.Text = text[3];
                button3clicked = false;
        }
    }

    private void Safe_Position2(TextBox tBr2, TextBox tBi2, TextBox tBj2, TextBox tBk2, string[] text)
    {
        if (button4clicked == true)
        {                           
                tBr2.Text = text[0];
                tBi2.Text = text[1];
                tBj2.Text = text[2];
                tBk2.Text = text[3];
                button4clicked = false;               
        }
    }

    private void Safe_Position3(TextBox tBr3, TextBox tBi3, TextBox tBj3, TextBox tBk3, string[] text)
    {
        if (button5clicked == true)
        {              
                tBr3.Text = text[0];
                tBi3.Text = text[1];
                tBj3.Text = text[2];
                tBk3.Text = text[3];
                button5clicked = false;             
        }
    }

    private void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string serialData = serial.ReadLine();
        String[] text = serialData.Split(new char[] { ' ' });
        AppendText(text);
        Safe_Position1(textBox5, textBox7, textBox8, textBox9, text);
        Safe_Position2(textBox10, textBox11, textBox12, textBox13, text);
        Safe_Position3(textBox14, textBox15, textBox16, textBox17, text);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        button3clicked = true;
    }

    private void button4_Click(object sender, EventArgs e)
    {
        button4clicked = true;
    }

    private void button5_Click(object sender, EventArgs e)
    {
        button5clicked = true;
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM