Лишние данные в очереди Queue - C#
Формулировка задачи:
Осваиваю работу с COM-портом. Отправку и простой приём данных победил, но ввиду неоднозначности приёма пакета данных решил складывать их в небольшой буфер (Queue), в котором уже искать начало пакета.
Пока данные отправляю сам себе (по клику), а принимаю по таймеру.
Для примера, отправляемые данные(hex) = 123ABC.
После чего на выходе имею:
Добавляю очередь. Пробовал считывать из буфера serialPort напрямую в очередь, обнаружил этот баг.
После чего сделал промежуточный этап с чтением в массив, а из него перенос в очередь. В итоге тот же баг.
Код второй версии (с промежуточным массивом):
На выходе имею:
Первая строка от первой части программы (без прогона через Queue).
Две оставшиеся после прогона через Queue. Почему-то на первой итерации (timer1_Tick) в очередь откуда не возьмись влез 00, но при чтении из очереди for (i = 0; i < FIFO.Count; i++) считалось только 3 байта. Один байт остался внутри, и считался на следующей итерации (timer1_Tick).
Пример для большего количества данных (1234567890ABCDEF):
Откуда берутся лишние нули, и почему всё не считывается из FIFO за первую итерацию, ума не приложу...
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
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
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
Решение задачи: «Лишние данные в очереди Queue»
textual
Листинг программы
for (i = 0; i < FIFO.Count; i++) { messByte[i] = (byte)FIFO.Dequeue(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д