Размер выходного буфера последовательного порта в Windows 7

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

В Windows 7 с пакетом обновления 1 (SP1) встроенный последовательный порт 16550 ведет себя так, как будто буфер вывода отсутствует. Вроде пишет блок, пока данные не выводятся из порта. Если есть буфер, то он даже меньше 16 байт, установленных в диспетчере устройств (в дополнительных настройках для COM1). Функция SetupComm позволяет указать рекомендуемые размеры входных и выходных буферов. Однако размер выходного буфера, похоже, не меняет поведения, и GetCommProperties всегда устанавливает для поля dwCurrentTxQueue нулевое значение. Единственное, что может сделать SetupComm, это увеличить размер входного буфера.


person dreamlayers    schedule 24.10.2011    source источник
comment
Машины уже давно не оснащены последовательным портом. Это реальный порт или эмулятор? Посмотрите драйвера в диспетчере устройств.   -  person Hans Passant    schedule 24.10.2011
comment
Да, это настоящий последовательный порт на материнской плате ПК. Вот что я имел в виду под встроенным последовательным портом 16550. 16550 — это тип микросхемы UART, с которой обычно совместимы встроенные порты.   -  person dreamlayers    schedule 26.10.2011


Ответы (1)


Документация для SetupComm специально разрешает драйверу устройства игнорировать запрошенные значения.

Лучше всего использовать перекрывающийся ввод-вывод и самостоятельно обрабатывать буферизацию.

person Harry Johnston    schedule 25.10.2011
comment
В документации также говорится, например, что функция может выполняться успешно, даже если драйвер не выделяет буфер, если какая-то другая часть системы обеспечивает эквивалентную функциональность. Я думаю, это всего лишь пример, а не гарантия. Спасибо за идею перекрытия ввода/вывода. - person dreamlayers; 26.10.2011
comment
В Windows 7 существует последовательность щелчков мышью по различным значкам, которые отображают размер буфера данного Com-порта. Я не могу вспомнить эту последовательность в этот момент. Я знаю, что делал это однажды. Я спросил об этом в SuperUser и не получил ответа. Когда я спросил на этом сайте, пользователь с репутацией более 41 000 моментально отругал меня за это, поэтому я снял вопрос. У нас есть приложение, которое ведет себя неправильно, и это знание (например, размер буфера com-порта) из самой Win'7, а не из нашего собственного приложения, нам очень поможет. Спасибо, если кто-нибудь когда-нибудь прочитает это сообщение. - person User.1; 07.02.2013
comment
@ User.1: вероятно, нет общего способа определить фактический размер буфера передачи. Вам нужно будет посмотреть документацию (если есть) для конкретного используемого драйвера устройства. - person Harry Johnston; 08.02.2013