Последовательный порт DataReceived слишком много стреляет - PullRequest
0 голосов
/ 26 ноября 2011

Я работаю с устройством идентификации вызывающего абонента и пишу следующую программу:

serialPort = new SerialPort("COM7", 19200, Parity.None, 8, StopBits.One);
serialPort.DataReceived += serialPort_DataReceived;
serialPort.RtsEnable = true;
serialPort.Encoding = Encoding.ASCII;
serialPort.Open();

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
{
    byte[] data = new byte[serialPort.BytesToRead];
    serialPort.Read(data, 0, data.Length);
    Console.WriteLine(Encoding.ASCII.GetString(data));
}

Сначала я получаю звонок, событие срабатывает идеально, и результат: "A0101181456926E"

Проблема заключается в последующих событиях ... в следующий раз, когда я звоню, событие serialPort_DataReceived часто срабатывает каждый раз с 1 символом.

Есть ли какое-либо свойство, которое нужно установить или метод, чтобы вызвать это поведение?

пс. Если я прокомментирую строку serialPort.RtsEnable = true;, я не получу никакого последующего события.

Ответы [ 3 ]

5 голосов
/ 26 ноября 2011

Как упоминал Хенк, вы можете установить количество байтов, которое будет получено до того, как событие DataReceived будет запущено, со свойством ReceivedBytesThreshold.

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

3 голосов
/ 26 ноября 2011

Это нормальное поведение.Вы можете изменить свойство ReceivedBytesThreshold, но это означает, что вы должны получить хотя бы эту сумму, и если при передаче возникают какие-либо ошибки, повторная синхронизация может быть затруднена.

Мой совет: оставьте ReceivedBytesThreshold = 1 и ставьте в очередь полученные данные до тех пор, пока не получите то, что вам нужно.

0 голосов
/ 22 июня 2016

Я сделал именно то, что предлагается, встроив механизм буферизации, чтобы определить, когда я получил полную входную строку на основе протокола поставщика.работает отлично.(Должен сказать, что не все схемы протоколов предоставляют четкие начальную и конечную последовательности для работы) Что я не мог понять, так это то, почему обработчик событий DataReceived все еще запускается, хотя, когда я читаю входной буфер с помощью метода Port.ReadExisting (), строкадлина была ноль.Читая о свойстве SerialPort.ReceivedBytesThreshold на https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.receivedbytesthreshold(v=vs.110).aspx Я понял, что, хотя по умолчанию для этого свойства установлено значение 1, обработчик все равно будет срабатывать ", если получен символ Eof, независимо от количества байтов во внутреннем вводебуфер "Может быть, это причина, по которой обработчик запускает то, что кажется ненужным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...