Как обеспечить период между двумя сообщениями через последовательный порт - PullRequest
0 голосов
/ 05 марта 2012

Документация для последовательного порта гласит:

Событие DataReceived не гарантируется для каждого байта получено. Используйте свойство BytesToRead, чтобы определить, сколько данных осталось прочитать в буфере.

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

Кто-нибудь знает, как SerialPort .NET решает, инициировать ли событие или нет. Чтобы избежать спама в событии на высоких скоростях, поэтому он их буферизирует?

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

Как подойти к этой проблеме?

РЕДАКТИРОВАТЬ : Немного больше исследований показывают, что это можно сделать, установив таймауты. Глупый я!

1 Ответ

2 голосов
/ 05 марта 2012

Это плохой план для протокола, если промежутки между сообщениями не меньше пары секунд.Windows не предоставляет никаких гарантий обслуживания для кода, который выполняется в пользовательском режиме, это не операционная система реального времени.Ваш код потерпит неудачу, когда машина будет сильно загружена, и ваш код будет вытеснен другими потоками, которые работают с более высоким приоритетом.Как темы ядра.Задержки составляют сотни миллисекунд, несколько секунд, безусловно, вполне возможно, особенно когда ваш код был выгружен, а файл подкачки фрагментирован.Очень трудно устранить неисправность, он ужасно плохо повторяется.

Альтернатива проста: просто используйте рамку вокруг сообщения, чтобы вы могли надежно определить начало и конец сообщения.Подойдут два байта, STX и ETX - популярный выбор.Добавьте байт длины, если в данных также может присутствовать байт конца сообщения.

...