У меня есть класс-оболочка, обертывающий класс .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 () каждый раз, но думаю, что это не будет хорошей практикой.
Можно ли ожидать такого эхо-поведения во ВСЕХ модемах? Если так, то я могу добавить код для фильтрации моих письменных данных.