Member 11396175 Ответов: 3

Последовательный порт send receive


Привет
У меня есть последовательный порт с 8 реле.
когда я посылаю в блок команду "FF A1 00", блок отвечает "FF A1 00 00 00 00 00 00 00 00" 8 двойных нулей-это все реле выключены.Если я открою первое реле и снова запрошу статус, то блок ответит "FF A1 01 00 00 00 00 00 00 00".
Поэтому я сделал приложение C# с одним текстовым полем с таймером, который отправляет команду в блок каждые 1000 мс, и еще одним текстовым полем, в котором я получаю ответ и 8 панелей.
Как можно отделить отклик только от 00 или 01 для вечного реле, чтобы покрасить панели.
красный для 00 и 01.
заранее спасибо.

Что я уже пробовал:

У меня нет приложения здесь, я сейчас не у себя дома. :-(

Gerry Schmitz

Я еще не видел от вас четкого заявления относительно "формата" данных, о которых идет речь.

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

Member 11396175

Спасибо за ваш комментарий. Пожалуйста, не могли бы вы объяснить мне, как я могу конвертировать двоичные файлы в текст?

3 Ответов

Рейтинг:
2

Member 11396175

Могу я спросить еще раз ?
Система.исключение indexoutofrangeexception

if (words[2].Equals("00"))
            {
                panel3.BackColor = Color.Green;
            }
            else
            {
                panel3.BackColor = Color.Red;
            }


Ralf Meier

Не задавайте дальнейших вопросов в качестве решения ...

Это означает, что вы пытаетесь получить доступ к элементу массива, который не существует-здесь Ваш массив "слова" не имеет элемента "[2] " - я полагаю, что он имеет только 2 элемента "[0]" и " [1]"...

Рейтинг:
1

RickZeeland

Вы можете использовать строка.Расщеплять()

string data = "FF A1 00 00 00 00 00 00 00 00";
string[] words = data.Split(' ');

if (words[2].Equals("00"))
{
    panel1.BackColor = Color.Green;
}
else
{
    panel1.BackColor = Color.Red;
}

if (words[3].Equals("00"))
{
    panel2.BackColor = Color.Green;
}
else
{
    panel2.BackColor = Color.Red;
}

if (words[4].Equals("00"))
{
    panel3.BackColor = Color.Green;
}
else
{
    panel3.BackColor = Color.Red;
}

// etc.....


Member 11396175

Спасибо за Ваш быстрый ответ
Данные, которые я получил от Блока, таковы: FF A1 00 00 00 00 00 00 00 00 я хочу отделить только 00 или 01 и покрасить панель.например, если ответ будет "01 01 01 01 01 01 01 01" вся панель будет менять цвет на красный.

RickZeeland

Смотрите обновленное решение, оно не очень элегантное, но простое для понимания, я надеюсь :)

Member 11396175

Большое спасибо!.
Этот бывший мне очень помогает, Но я получаю статус в текстовом поле.

Member 11396175

я думаю, что я сделал это
строковые данные = textBox1.Text;

RickZeeland

Правильно, удачи в завершении работы !

Member 11396175

Спасибо вам всем за ваши ответы!!!!!!!!!

Рейтинг:
0

Member 11396175

<pre>public partial class Form1 : Form
    {
        Communication comm;
        Int32 count = 0;


        public Form1()
        {
            InitializeComponent();
            comm = Communication.Instance();
            comm.Communication_Set(9600, 8);
            comboBox1.Items.Clear();
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_Closing);
            foreach (string selCOM in comm.selectCOM())
            {
                comboBox1.Items.Add(selCOM);
            }
            comboBox1.Sorted = true;
            label1.Text = "";
        }

        private void openCOM_Click(object sender, EventArgs e)
        {
            try
            {
                label1.Text = comm.openCOM(comboBox1.Items[comboBox1.SelectedIndex].ToString());
            }

            catch
            {
                label1.Text = "First select COM port!";
            }
        }

        private void closeCOM_Click(object sender, EventArgs e)
        {
            label1.Text = comm.CloseCOM();
        }

        private void sendData_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != string.Empty)
            {
                string hexString = textBox1.Text;
                byte[] rxByte = new byte[1];



                if (!comm.serialWrite(stringToHEX(hexString), 0, stringToHEX(hexString).Length)) 
                { 
                    label1.Text = "Cannot send data!Try to open COM port first!"; 
                    return; 
                }
                Thread.Sleep(50);
                //textBox2.Text += count.ToString() + "";
                while (comm.serialBytesToRead() > 0)
                {
                    rxByte[0] = comm.serialRead();
                    textBox2.Text += ByteToHex(rxByte).ToString();
                }
                //textBox2.Text += " \r\n";
            }
        }


        private void Clear_Click(object sender, EventArgs e)
        {
            textBox2.Text = string.Empty;
        }


        private string ByteToHex(byte[] data)
        {
            StringBuilder sb = new StringBuilder(data.Length * 3);
            foreach (byte b in data)
                sb.Append(Convert.ToString(b, 16).PadRight(3, ' ')); // edw
            return sb.ToString().ToUpper();
        }
        public byte[] stringToHEX(string s)
        {
            char[] splitter = {};
            string[] splitS = s.Split(splitter, StringSplitOptions.RemoveEmptyEntries);

            byte[] buff = new byte[splitS.Length];

            for (int i = 0; i < splitS.Length; i++)
            {
                try
                {
                    buff[i] = Convert.ToByte(splitS[i], 16);
                }

                catch
                {
                    //buff[i] = 0x00;
                }
            }
            return buff;
        }


        private void Form_Closing(object sender, FormClosingEventArgs e)
        {

            if (comm.serialIsOpen()) comm.CloseCOM();

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            string data = textBox2.Text;
            string[] words = data.Split(' ');

            if (words[0].Equals("FF"))
            {
                panel1.BackColor = Color.Green;
            }
            else
            {
                panel1.BackColor = Color.Red;
            }
            if (words[1].Equals("A1"))
            {
                panel2.BackColor = Color.Green;
            }
            else
            {
                panel2.BackColor = Color.Red;
            }
            if (words[2].Equals("00"))
            {
                panel3.BackColor = Color.Green;
            }
            else
            {
                panel3.BackColor = Color.Red;
            }

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

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            sendData.PerformClick();

        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            Clear.PerformClick();
        }