C#在文本框

时间:2018-05-24 14:30:26

标签: c# serial-port uart

我正在将带有NUCLEOF411RE的传感器信息发送到我的电脑。我在COM98上收到这个数据,BaudRate为115200.现在我想编写一个Windows应用程序,它将分割我的字符串并将其放在我的文本框中。到目前为止,我使用Button_click事件显示数据。它将值放在实际上是实际值的文本框中。但是,如果我移动我的传感器并再次按下该按钮,则应该有更多不同的值,但文本框中的值相同。此外,我想自动刷新文本框,而不是点击按钮。

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

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

您能否提供有关使用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...
}

答案 1 :(得分:0)

我会做几件事。首先在串行端口上订阅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);
}

答案 2 :(得分:0)

因为我想添加一个旋转的3D立方体,所以我决定切换到WPF。我听说在那里实现3D图形要容易得多。所以我将我的代码复制到新的WPF项目中。但是现在我已经遇到了在Textboxes上可视化我的值的问题。它不起作用。看起来Evenhandler在从com端口接收数据时没有触发事件。

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;
    }
}

}