C # Serial Port Read - Получить кодированные сообщения COBS с различной длиной - PullRequest
0 голосов
/ 13 марта 2019

так что я новичок в программировании на C #. Я запрограммировал приложение C # Forms в Visual Studio для связи / инициализации устройства через последовательный порт. Связь между устройством кодируется COBS, поэтому нет байтов 0x00, кроме как в конце каждого сообщения. Отправленные и полученные сообщения имеют разную длину.

В данный момент моя проблема в том, что полученные мной сообщения не завершены или начинаются с середины сообщения, поэтому я не могу инициировать отправленные сообщения с определенным значением в полученных сообщениях. Вы можете определить конец сообщения с полученным 0x00 (0x00 означает конец сообщения в кодированных данных COBS)

Так что мне нужно что-то, чтобы обработать полное сообщение и поместить его в байтовый массив, чтобы проанализировать, например, байт [11] на предмет конкретного значения.

Вот что я сделал до сих пор:

    private bool   b_portopen = false;
    private byte[] b_rcv_buffer = new byte[256];

    private void button1_Click(object sender, EventArgs e) {

            //InitTimer();

            if (b_portopen == false)
            {
                serialPort1.PortName = comboBox1.SelectedItem.ToString();
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
                serialPort1.Open();
                b_portopen = true;
                button1.Text = "Close";
                button2.Enabled = true;
                Console.WriteLine("Serial Port Opened");
            }
            else if (b_portopen == true)
            {
                serialPort1.Close();
                b_portopen = false;
                button1.Text = "Open";
                button2.Enabled = false;
                Console.WriteLine("Serial Port Closed");
            }
        }
private async void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            serialPort1.Read(b_rcv_buffer, 0, 256);
            //serialPort1.Read(b_rcv_buffer1, 11, 2);
            richTextBox1_receive.Invoke(new Action(() =>
            {
                richTextBox1_receive.AppendText(BitConverter.ToString(b_rcv_buffer) + "\n");
                richTextBox1_receive.ScrollToCaret();
            }));
            switch (b_rcv_buffer[10])
            {
                case b_state_startup:
                    do something

                case b_state_be_start_conf:
                    do something

                case b_state_keepalive_conf:
                    do something

                case b_state_unprepare_conf:
                    do something

                case b_state_prepare_conf:
                    do something


            }


        }

1 Ответ

0 голосов
/ 18 марта 2019

Итак, я нашел решение с использованием ConcurrentQueue:

    ConcurrentQueue<byte> b_rcv_buffer = new ConcurrentQueue<byte>();

    private Timer timer2;

    public void InitTimer()
            {
                timer2 = new System.Windows.Forms.Timer();
                timer2.Tick += new EventHandler(timer2_Tick);
                timer2.Interval = 1; // in miliseconds
                timer2.Start();
            }

    private async void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            int bytes = serialPort1.BytesToRead;
            byte[] buf = new byte[bytes];
            serialPort1.Read(buf, 0, serialPort1.BytesToRead);

            for(int i = 0; i < buf.Length; i++)
            {
                b_rcv_buffer.Enqueue(buf[i]); //Enqueue every received Byte in Concurrentqueue
            }
        }

private async void timer2_Tick(object sender, EventArgs e)
        {
            if (b_rcv_buffer.Contains<byte>(0x00))
            {
                byte[] array = b_rcv_buffer.ToArray();

                richTextBox1_receive.Invoke(new Action(() =>
                {
                    richTextBox1_receive.AppendText(BitConverter.ToString(array) + "\n");
                    //richTextBox1_receive.ScrollToCaret();
                }));            

                byte ignored;

                while (b_rcv_buffer.TryDequeue(out ignored));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...