Я использую довольно красивый проект nmeasharp, чтобы расшифровать поток NMEA, который я получаю на последовательном порту в C#. Все это прекрасно работает, но я хочу отразить данные на IP-адресе и застревать.Создание и сохранение потока в реальном времени в C#
nmeasharp пакет получает свои данные из любого потока, так что я использовал, чтобы подключить его к последовательному потоку порта, который работал отлично:
_nmeaParser.Source = serialport.BaseStream;
Теперь я хочу использовать серийное событие порта для запуска моя рутина, где я могу перенаправить данные, поэтому я удалить назначение выше, и установите:
_serialport.DataReceived += new serialDataReceivedEventHandler(HandleNewSerialPortData);
Это событие срабатывает, метод вызывается. Все хорошо на данный момент, но код nmeasharp по-прежнему ищет поток для прослушивания, так как я больше не привязывал его к потоку.
Следующий метод - это то, где мне нужно настроить поток для nmeasharp и записывать любые новые данные, которые только что получил последовательный порт в этот поток.
private void HandleNewSerialPortData(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
this.serialDataAvailable(indata); // raise event that writes string to IP
if (_nmeaParser.Source == null) _nmeaParser.Source = new MemoryStream(840);
if (_nmeaParser.Source.CanWrite) _nmeaParser.Source.Write(ASCIIEncoding.UTF8.GetBytes(indata), 0, indata.Length);
// Unsuccessful attempts
// MemoryStream s = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(indata));
// s.CopyTo(_nmeaParser.Source);
// sp.BaseStream.CopyTo(this.NmeaDataStreamFromSerialPort);
}
Я пробовал несколько вариантов попыток записи в поток nmeasharp, но никто не работает. Тот, который показал обещание, каждый раз инициализировал новый поток, но это означало, что поток был закрыт после каждого события DataReceived
, который усекал и пропускал серийные сообщения. (Неудачно) код был:
_nmeaParser.Source = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(indata));
Я прочитал много учебников, прочитайте всю документацию MSDN я смог найти, и до сих пор не может получить эту простую вещь работать. У этого есть, чтобы быть легким, правильным ...?
Редактировать: Я хотел бы сохранить nmeasharp код акции, если это возможно, как это работает отлично, и поскольку последовательные данные не всегда ASCII, хотел бы сохранить его бинарные (потоки), а не отправлять его данные в виде строки. Я могу исправить IP-перенаправление для двоичных файлов позже.
Спасибо.
Спасибо Am, Хорошая идея, но я не слишком озабочен копированием потоков в данный момент - я даже не могу настроить один поток в качестве входа для nmeasharp. Как только я смогу настроить постоянный поток, который я могу написать, конечно, ваша идея кажется элегантной. – DefenestrationDay
ОК, поэтому у меня теперь есть разделитель потока, который берет поток и выводит его идентично двум (или более) потокам назначения. работает хорошо. однако, чтение из одного из них (как запоминающий поток) является кошмаром. что я делаю в stream.position? я могу сбросить его до нуля для каждого чтения? делает это завинчивание писем? .. – DefenestrationDay