У меня есть встроенное устройство под управлением 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
- таким образом фрагменты будут собраны вместе ... но это не сработает в самый важный случай из всех, когда я жду, чтобы найти приглашение оболочки, поскольку эта строка никогда не попадет во вторую очередь.
Идеи?