SerialPort - очистить существующие данные - PullRequest
1 голос
/ 01 февраля 2011

Я использую класс .NET SerialPort для связи с датчиками.Каждый раз, когда нажимается кнопка на датчике, через порт отправляется считываемое значение.

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

У меня есть текущий обходной путь, использующий Thread.Sleep, но он кажется хакерским, и мне интересно, знает ли кто-нибудьлучшего решения.

port = New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)

port.Open()
port.DtrEnable = True

System.Threading.Thread.Sleep(100)
port.ReadExisting()

AddHandler port.DataReceived, AddressOf PortDataReceived

Если у меня нет Thread.Sleep, то событие DataReceived вызывается для данных предыдущего датчика.Я предполагаю, что это потому, что ReadExisting не блокируется и поэтому, когда он вызывается сразу после открытия, он просто ничего не читает.

Спасибо


Так что если вы вызываете 'port.BytesToRead () 'сразу после открытия его ноль.Если вы называете это через 100 мс после открытия, он ненулевой.Я предполагаю, что это имеет смысл - для чтения существующих данных требуется время после открытия.

Другой вариант - вызвать чтение и установить тайм-аут чтения, но это не отличается от Thread.Sleep, за исключением того, что вам нужно пойматьисключение ...

Ответы [ 2 ]

1 голос
/ 01 февраля 2011
 port.DtrEnable = True

Это может иметь побочный эффект. Датчик может прыгать вверх и вниз, стремясь отправить показания. В конце концов, кто-то нажал кнопку, чтобы сказать, что отправка возможна. Но его процедура передачи соблюдает протокол квитирования, Data Terminal Ready не включен. Прыгай, прыгай, ах! это включено. Послать. Это занимает некоторое время, зависит от скорости передачи.

Ну, почему кто-то нажал кнопку, хотя компьютер не был готов? Почему он не всегда готов? Ответьте на этот вопрос, затем вы можете удалить Sleep (). Также выясните, что происходит, когда кто-то нажимает кнопку сотни раз, прежде чем компьютер будет готов. Ваш сон () вполне может быть слишком коротким.

0 голосов
/ 29 ноября 2013

Если вам не нужно собирать то, что ожидает в буфере вывода последовательного порта, попробуйте вызвать serialPort.DiscardWriteBuffer () serialPort.DiscardOutBuffer (), который должен очистить все, что там собрано.Спасибо Чэду за исправление моей ошибки.

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