2010-06-03 3 views
3

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

  1. Прежде всего, я хочу знать, какие функции приводятся события:

     
    ReadExisting() 
    Read() 
    Readbyte() 
    Readchar() 
    ReadLine() 
    Readto() 
    
  2. Как я могу принять необходимые данные образуют входной поток этого порта?

    У меня есть протоколы статического размера. Могу ли я использовать специальный символ для указания пределов данных протокола и который будет подходящим символом для этого?

  3. Как обработать это исключение:

    C# SerialPort System.ObjectDisposedException, безопасная ручка была закрыта в System.dll

ответ

6

Ни один из этих методов не являются «событийная », вы должны использовать их в событии DataReceived. Это вызывается, когда последовательный порт имеет как минимум один байт данных, доступных для чтения.

Не уверен, что означает «статический размер». Если устройство отправляет фиксированное количество байтов, вы должны использовать метод Read() для их чтения. Обратите внимание на возвращаемое значение, вы получите только столько байтов, сколько доступно. Храните их в байте [] и добавьте их в следующее событие DR, пока не получите их все.

Если устройство отправляет символы, а не байты, вы обычно можете воспользоваться свойством NewLine. Установите его на символ или строку, которая завершает ответ. Линейный перевод («\ n») является наиболее типичным выбором. Прочитайте ответ с помощью ReadLine(). В этом случае буферизация не требуется.

Вы получите исключение ObjectDisposed при закрытии формы, но не гарантируете, что устройство перестанет отправлять данные. Обязательно используйте только BeginInvoke в событии DataReceived, а не Invoke. И не вызывайте BeginInvoke, если свойство IsDisposed формы истинно.

6

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

например. если ваш протокол сообщений имеет длину 20 байтов, событие DataReceived срабатывает, и вы пытаетесь прочитать 20 байтов. Они все могут быть там, они не могут. Довольно вероятно, что их не будет, в зависимости от скорости вашего бод.

Вам необходимо проверить свойство BytesToRead порта, который вы читаете, и прочитать эту сумму в своем буфере. Если и когда доступно больше байтов, событие DataReceived снова запустится.

Обратите внимание, что событие DataReceived будет срабатывать, когда количество принимаемых байтов будет по меньшей мере равнозначению свойства ReceivedBytesThreshold для последовательного порта. По умолчанию я полагаю, что это значение равно 1.

Если вы установите это значение 10, например, событие будет срабатывать, когда 10 или более байтов ждут приема, но не меньше. Это может или не может вызвать проблемы, и я предпочитаю оставить это значение свойства равным 1, так что все полученные данные будут запускать событие, даже если получено только 1 байт.

Не ошибитесь, что это вызовет событие для каждого получаемого байта - это не будет сделано.

Смежные вопросы