У меня есть встроенное устройство под управлением Linux, с которым я могу общаться через RS232. Я пытаюсь программно управлять им из существующего приложения .NET, поэтому я дурачился с классом System.IO.Ports.SerialPort
. Я сейчас читаю данные с порта, используя обработчик событий SerialPortDataRecieved
и проверяю количество байтов для чтения, затем передаю byte[]
такого размера, ТО затем помещаю byte[]
в Queue<byte[]>
для дальнейшей обработки, вот так:
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
, непредсказуемо и совершенно не знает, какую информацию он отправляет, поэтому куски данных, которые я получаю, как правило, представляют собой фрагменты строк.
То, что я ищу, - это простой, производительный, многопоточный способ перехода от фрагмента строки byte[]
к string
, который организован аккуратно в соответствии со строками. Одна из моих идей заключалась в том, чтобы создать другой поток, бесконечно зацикливающийся, который бы вытеснил byte[]
с из очереди, превратил их в string
с, добавил их к StringBuilder
, а затем разделил string
, возвращенный из StringBuilder.ToString()
вдоль newlines
, взять строку LAST и использовать ее для создания нового StringBuilder
в следующий раз, затем поместить все остальные строки в Queue<string>
- таким образом, фрагменты будут собраны вместе ... ... но это не сработает в самом важном случае - когда я жду, когда найду приглашение оболочки, так как эта строка никогда не попадет во вторую очередь.
Идеи