Создание и поддержание потока в C # - PullRequest
1 голос
/ 07 января 2011

Я использую изящный проект nmeasharp , чтобы расшифровать поток NMEA, который я получаю через последовательный порт в c #. Все работает нормально из коробки, но я хочу отразить данные на IP-адрес, и я застреваю.

Пакет 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 для двоичного файла позже.

Спасибо.

1 Ответ

2 голосов
/ 07 января 2011

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

Вы можете посмотреть здесь для хорошего решения о том, как копировать потоки.

...