C # отображать переменную в текстовом поле - PullRequest
0 голосов
/ 24 мая 2018

Я отправляю информацию датчика с 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 голосов
/ 24 мая 2018

Я бы сделал пару вещей.Сначала подпишитесь на событие DataReceived на последовательном порту.Этот обработчик события будет вызываться при наличии данных на последовательном порту.Затем в обработчике событий вы можете прочитать с последовательного порта и добавить его в текстовое поле.Вы не можете добавить его напрямую (см. Функцию AppendText), потому что обработчик событий вызывается из другого потока, только поток пользовательского интерфейса может обновлять компоненты пользовательского интерфейса (или вы получите исключение между потоками).

...
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);
}
0 голосов
/ 25 мая 2018

Поскольку я хочу добавить вращающийся трехмерный куб, я решил переключиться на WPF.Я слышал, что реализовать 3D-графику гораздо проще.Поэтому я скопировал свой код в новый проект WPF.Но теперь у меня уже есть проблемы с визуализацией моих значений в текстовых полях.Это не работает.Похоже, что 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;
    }
}

}

0 голосов
/ 24 мая 2018

Можете ли вы дать больше информации, почему вы используете событие Button_Click для чтения текста?Может быть, это возможный способ подписаться на DataReceived-Event COM-порта?Это будет выглядеть примерно так:

serial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

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