Лишние данные в очереди Queue - C#

Узнай цену своей работы

Формулировка задачи:

Осваиваю работу с COM-портом. Отправку и простой приём данных победил, но ввиду неоднозначности приёма пакета данных решил складывать их в небольшой буфер (Queue), в котором уже искать начало пакета. Пока данные отправляю сам себе (по клику), а принимаю по таймеру. Для примера, отправляемые данные(hex) = 123ABC.
private void timer1_Tick(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == true)
            {
                int byteRecieved = serialPort1.BytesToRead; // Считывает количество байт в буфере
                byte[] messByte = new byte[byteRecieved]; // Создаёт массив по размеру буфера
                serialPort1.Read(messByte, 0, byteRecieved); // Считывает из буфера в массив
                string st = BitConverter.ToString(messByte); // Конвертирует массив в строковую
 
                if (st.Length != 0) // Если строковая не пуста...
                {
                    // Вывод в textBoxRead "Количество принятых байт = Данные"
                    textBoxRead.Text = textBoxRead.Text + byteRecieved.ToString() + " = " + st + Environment.NewLine;
                    // Автопрокрутка textBoxRead
                    textBoxRead.SelectionStart = textBoxRead.Text.Length;
                    textBoxRead.ScrollToCaret();
                }
            }
После чего на выходе имею:
3 = 12-3A-BC
Добавляю очередь. Пробовал считывать из буфера serialPort напрямую в очередь, обнаружил этот баг. После чего сделал промежуточный этап с чтением в массив, а из него перенос в очередь. В итоге тот же баг. Код второй версии (с промежуточным массивом):
Queue FIFO = new Queue(200); // Объявил очередь
private void timer1_Tick(object sender, EventArgs e)
{
        if (serialPort1.IsOpen == true)
        {
                int i = 0;
                int byteRecieved = serialPort1.BytesToRead; // Считывает количество байт в буфере
                byte[] messByte2 = new byte[byteRecieved]; // Создаёт массив по размеру буфера
                serialPort1.Read(messByte2, 0, byteRecieved); // Считывает из буфера в массив
                string st = BitConverter.ToString(messByte2); // Конвертирует массив в строковую
 
                if (st.Length != 0) // Если строковая не пуста...
                {
                    // Вывод в textBoxRead "Количество принятых байт = Данные"
                    textBoxRead.Text = textBoxRead.Text + byteRecieved.ToString() + " = " + st + Environment.NewLine;
                    // Автопрокрутка textBoxRead
                    textBoxRead.SelectionStart = textBoxRead.Text.Length;
                    textBoxRead.ScrollToCaret();
                }
 
                // Запись из массива в очередь (по количеству принятых байт)
                for (i = 0; i < byteRecieved; i++)
                {
                    FIFO.Enqueue(messByte2[i]);
                }
 
                byte[] messByte = new byte[FIFO.Count]; // Новый массив для чтения из очереди
 
                // Чтение из очереди
                for (i = 0; i < FIFO.Count; i++)
                {
                    messByte[i] = (byte)FIFO.Dequeue();
                }
 
                st = BitConverter.ToString(messByte); // Конвертирует массив в строковую
 
                if (st.Length != 0) // Если строковая не пуста...
                {
                    // Вывод в textBoxRead "Количество принятых байт = Текущий размер FIFO = Данные"
                    textBoxRead.Text = textBoxRead.Text + byteRecieved.ToString() + " = " + FIFO.Count.ToString() + " = " + st + Environment.NewLine;
                    // Автопрокрутка textBoxRead
                    textBoxRead.SelectionStart = textBoxRead.Text.Length;
                    textBoxRead.ScrollToCaret();
                }
            }
        }
На выходе имею:
3 = 12-3A-BC
3 = 1 = 12-3A-00
0 = 0 = BC
Первая строка от первой части программы (без прогона через Queue). Две оставшиеся после прогона через Queue. Почему-то на первой итерации (timer1_Tick) в очередь откуда не возьмись влез 00, но при чтении из очереди for (i = 0; i < FIFO.Count; i++) считалось только 3 байта. Один байт остался внутри, и считался на следующей итерации (timer1_Tick). Пример для большего количества данных (1234567890ABCDEF):
8 = 12-34-56-78-90-AB-CD-EF
8 = 4 = 12-34-56-78-00-00-00-00
0 = 2 = 90-AB-00-00
0 = 1 = CD-00
0 = 0 = EF
Откуда берутся лишние нули, и почему всё не считывается из FIFO за первую итерацию, ума не приложу...

Решение задачи: «Лишние данные в очереди Queue»

textual
Листинг программы
                for (i = 0; i < FIFO.Count; i++)
                {
                    messByte[i] = (byte)FIFO.Dequeue();
                }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы