С#, разделение последовательных данных и отображение в отдельных текстовых полях

У меня есть следующий код, и я хотел бы разделить входящие последовательные данные на части и отобразить отдельные части в отдельных текстовых полях. Входящие последовательные данные

  • angle1:angle2:value1:value2:value3:value4

куда

  • angle1 имеет значения от -90 до 90
  • angle2 находится в диапазоне от 0 до 90
  • value1 value2 value3 value4 от 0 до 1024

Поэтому я хотел бы отображать каждый из них в разных текстовых полях.

Это то, что у меня есть до сих пор, которое отображает всю входящую строку в одном текстовом поле.

Любая помощь, идея и совет высоко ценятся, так как я новичок в С#.

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static System.IO.Ports.SerialPort port;

        delegate void SetTextCallback(string text);

        private BackgroundWorker hardWorker;
        private Thread readThread = null;

        public Form1() 
        {
            InitializeComponent();
            hardWorker = new BackgroundWorker();
            string[] ports = SerialPort.GetPortNames();
            comboBox1.Items.AddRange(ports);
        }

        private void Form1_Load(object sender, EventArgs e) {}

        private void SetText(string text)
        {
            if (this.receiveText.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                //this.receiveText.Text += "";
                this.receiveText.Text += text;
                this.receiveText.Text += Environment.NewLine;
            }
        }

        public void Read()
        {
            while (serialPort2.IsOpen)
            {
                try{
                    if (serialPort2.BytesToRead > 0)
                    {
                        Thread.Sleep(1000);
                        string message = serialPort2.ReadLine();
                        this.SetText(message);
                    }
                }
                catch (TimeoutException) { }
            }
        }

        private void start_Click(object sender, EventArgs e)
        {
            System.ComponentModel.IContainer components = new System.ComponentModel.Container();   

            if (comboBox1.SelectedIndex > -1)
            {
                string port = (string)comboBox1.SelectedItem;
                serialPort2.PortName = port;
                serialPort2.BaudRate = 9600;
                serialPort2.DtrEnable = true;
                serialPort2.ReadTimeout = 1000;
                serialPort2.WriteTimeout = 500;
                serialPort2.Open();
                readThread = new Thread(new ThreadStart(this.Read));
                readThread.Start();
                this.hardWorker.RunWorkerAsync();
            }
        }

        private void receiveText_TextChanged(object sender, EventArgs e)
        {
            receiveText.SelectionStart = receiveText.Text.Length;
            receiveText.ScrollToCaret();
            receiveText.Refresh();
        }
    }
}

РЕШЕНО путем изменения следующего:

private void SetText(string text)
  {
    if (this.receiveText.InvokeRequired)
      {
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
      }
    else
      {
        string[] newData = text.Split(':');
        boxLR.Text = newData[0];
        boxUD.Text = newData[1];
        boxldrright.Text = newData[2];
        boxldrleft.Text = newData[3];
        boxldrup.Text = newData[4];
        boxldrdown.Text = newData[5];
      }
  }

Спасибо всем за вашу помощь.


person Darellon    schedule 25.09.2014    source источник
comment
Не прочитал весь ваш код, но не разделяет (:) решение вашей проблемы ??   -  person apomene    schedule 25.09.2014


Ответы (3)


Прежде всего, вам нужно разделить строку, чтобы получить все разные значения в виде отдельной строки. В вашей функции SetText();

  string[] slist = text.Split(':');

Теперь, если у вас есть все необходимое текстовое поле, вы можете присвоить значение массива строк другому текстовому полю.

Или еще

если вы создаете среду выполнения текстового поля, вам нужно создать новое текстовое поле в соответствии с длиной массива slist, а затем присвоить значение новым текстовым полям.

Надеюсь, поможет..!!!

person H. Mahida    schedule 25.09.2014

Вы можете использовать this.receivedText.Text.Split(':'), чтобы разделить полученную текстовую строку на массив строк, который затем можно использовать для индивидуального назначения различным текстовым полям.

В дополнение к этому вы также можете создать метод, который принимает массив в качестве параметра для проверки различных ограничений значений.

person Bernd Linde    schedule 25.09.2014

Если длина значений одинакова, вы можете использовать public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)

person andrejke    schedule 25.09.2014