Использование SerialPort.BytesToWrite - PullRequest
3 голосов
/ 13 мая 2011

Если SerialPort.Write () является блокирующей операцией (или нет?), Зачем нужен метод BytesToWrite ().Он всегда будет иметь нулевое значение, потому что последняя операция записи либо преуспела в записи всех данных, либо потерпела неудачу, в любом случае записываемые байты будут равны нулю.

Возможно, в этом есть нечто большее, чем то, что яописал.

Ответы [ 3 ]

4 голосов
/ 13 мая 2011

SerialPort.Write - это операция блокировки, да.Однако следует рассмотреть два буфера: последовательное устройство и буферы SerialPort.

Если объект SerialPort сконфигурирован для буферизации, блоки только для записи, если недостаточно места вэтот буфер.Он будет блокироваться до тех пор, пока буфер не будет достаточно пуст, чтобы соответствовать новым данным.В противном случае он заполняет буфер и возвращает.

Если объект SerialPort не буферизуется, операция записи блокируется только на время, необходимое для передачи данных на последовательное устройство.Это устройство имеет собственный буфер (*), поэтому блок может занять гораздо меньше времени, чем время, необходимое для отправки данных.

SerialPort.BytesToWrite включает как данные в буфере устройства, так и данные в SerialPort буфер объекта.

(*) В старых UART не было буферов, а в более новых есть, но их можно настроить на отсутствие буферизации.

2 голосов
/ 13 мая 2011

Последовательные порты - это очень медленные устройства ввода-вывода, которые датируются каменным веком вычислений. При общей скорости передачи 9600 бит в секунду он может передавать только чуть менее тысячи байтов в секунду. По сравнению с жестким диском возможна скорость записи 60 000 000 байт в секунду. Или, что еще более сопоставимо, сетевая карта может передавать 125 000 000 байт в секунду.

Таким образом, драйвер последовательного порта сохраняет буфер, в котором хранятся записанные вами байты, и медленно очищает его, пока они записываются микросхемой UART. Этот буфер позволяет быстро вернуть вызов Write (). Учитывая, что он настолько медленный, вы можете знать, насколько заполнен этот буфер, чтобы избежать блокирования при вызове Write (). WriteBufferSize - BytesToWrite сообщает, сколько места доступно в этом буфере.

1 голос
/ 13 мая 2011

Свойство SerialPort BytesToWrite Получает количество байтов данных в буфере отправки.

С другой стороны, метод SerialPort Запись (текст строки) Запись указанной строки в последовательный порт.

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

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