2011-01-07 9 views
1

Я использую довольно красивый проект 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-перенаправление для двоичных файлов позже.

Спасибо.

ответ

2

Я бы попытался создать два потока. Прочитайте из последовательного потока вручную и скопируйте в оба потока. Установите nmeaParser для использования одного из них и попросите обработчик IP читать со второго.

Вы можете написать look here за хорошее решение о том, как копировать потоки.

+0

Спасибо Am, Хорошая идея, но я не слишком озабочен копированием потоков в данный момент - я даже не могу настроить один поток в качестве входа для nmeasharp. Как только я смогу настроить постоянный поток, который я могу написать, конечно, ваша идея кажется элегантной. – DefenestrationDay

+0

ОК, поэтому у меня теперь есть разделитель потока, который берет поток и выводит его идентично двум (или более) потокам назначения. работает хорошо. однако, чтение из одного из них (как запоминающий поток) является кошмаром. что я делаю в stream.position? я могу сбросить его до нуля для каждого чтения? делает это завинчивание писем? .. – DefenestrationDay

Смежные вопросы