Лишние данные в очереди 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();
}