Запись данных SerialPort заканчивается в буфере приема - PullRequest
0 голосов
/ 31 августа 2011

У меня есть класс-оболочка, обертывающий класс .Net SerialPort для выполнения модемных операций и потока данных. Когда я читаю из объекта SerialPort, данные, которые я ранее записал в порт, находятся в приемном буфере. Это поведение, которое я могу изменить с помощью объекта SerialPort? Я не нашел свойства для класса, которое препятствует тому, чтобы мои исходящие данные попадали в приемный буфер.

Я использую SerialPort.Write () для записи данных, и это то, что я делаю для чтения данных

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Task.Factory.Startnew(() => WriteToBuffer());
}

// ... 

private void WriteToBuffer()
{
    string data = string.Empty;

    lock(_serialPort)
    {
        StringBuilder sb = new StringBuilder();

        while(_serialPort.BytesToRead > 0)
        {
            sb.Append(_serialPort.ReadExisting());
        }

        data = sb.ToString();
    }

    // .. then do some additional processing
}

Я читаю данные неблокирующим образом, потому что я предпочел бы быть параноиком и не пропустить события, полученные из данных, и заставить клиентский код думать, что был какой-то тип времени ожидания.

Я могу предотвратить копирование команд Hayes AT в приемный буфер, отправив ATE0, но любые данные, которые я отправляю после подключения модема к удаленному модему, все еще проникают в приемный буфер.

Что я могу сделать? Трудно просто проверить и посмотреть, что я написал последним в буфер, и проигнорировать это, потому что иногда я читаю по одному байту за раз, и это часть возвращаемых данных. Например, если я отправлю что-то вроде «ID 123», я мог бы прочитать «ID» с помощью цикла while и обнаружить, что есть 0 байтов для чтения, поэтому он останавливается там. Я знаю, что могу просто вызывать Thread.Sleep () каждый раз, но думаю, что это не будет хорошей практикой.

Можно ли ожидать такого эхо-поведения во ВСЕХ модемах? Если так, то я могу добавить код для фильтрации моих письменных данных.

1 Ответ

0 голосов
/ 07 декабря 2011

Я опробовал несколько других модемов, и данные записи вернулись во входной буфер точно так же, как исходная модель модема, которую я пробовал. Моим решением было отфильтровать записанные данные, чтобы правильно прочитать другие данные, поступающие с удаленного модема.

...