Обработка текста, исходящего из последовательной линии в C #

У меня есть встроенное устройство под управлением Linux, с которым я могу связываться через RS232. Я пытаюсь программно управлять им из существующего .NET-приложения, поэтому я дурачился с классом System.IO.Ports.SerialPort . Я читаю данные с порта прямо сейчас, используя обработчик событий SerialPortDataRecced и проверяю количество байтов для чтения, а затем передаю байт [] этого размера, ТОГДА помещая этот байт [] в Queue для дальнейшей обработки, например:

public class SerialTalk{
SerialPort s;    
Queue<byte[]> RecQueue=new Queue<byte[]>;
//...bunch of irrelevant stuff here (ctors etc)
   private void DataReceivedHandler(Object sender, SerialDataReceivedEventArgs e)
   {
        byte[] recv;
        lock (s_lock)
        {
            int bytes = s.BytesToRead;
            recv = new byte[bytes];
            s.Read(recv, 0, bytes);
        }

        Console.Write(recv);
        lock (RecQueue)
        {
            RecQueue.Enqueue(recv);
        }
   }
}

Другой поток затем читает из этой очереди для выполнения обработки, выводя на терминал и т. д. Это отлично работает для печати, но я хочу иметь возможность повторно выражать данные, которые я получаю. Проблема в том, что количество байтов, возвращаемых SerialPort , непредсказуемо и совершенно не известно, какую информацию он отправляет, поэтому получаемые мной блоки данных, как правило, представляют собой фрагменты строк.

Я ищу простой, производительный, многопоточный способ перехода от строкового фрагмента байта [] к строковым s, которые аккуратно организованы по строкам. Одна из моих идей заключалась в том, чтобы создать бесконечный цикл для другого потока, который удалял бы байтов [] из очереди, превращал их в строки , добавлял их в StringBuilder ], затем разделите строку , возвращенную из StringBuilder.ToString () , вдоль новой строки , возьмите ПОСЛЕДНЮЮ строку и используйте ее для создания новой StringBuilder в следующий раз, затем поместите все остальные строки в очередь в Queue - таким образом фрагменты будут собраны вместе ... но это не сработает в самый важный случай из всех, когда я жду, чтобы найти приглашение оболочки, поскольку эта строка никогда не попадет во вторую очередь.

Идеи?

6
задан Alexander Questioning Bresee 16 August 2011 в 15:22
поделиться