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

#windows #winapi #serial-port #serial-communication

#Windows #winapi #последовательный порт #последовательная связь

Вопрос:

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

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

Комментарии:

1. Машины долгое время не были оснащены последовательным портом. Это реальный порт или это на самом деле эмулятор? Посмотрите на драйвер в диспетчере устройств.

2. Да, это настоящий последовательный порт на материнской плате ПК. Это то, что я имел в виду под «встроенным последовательным портом 16550». 16550 — это тип чипа UART, с которым обычно совместимы встроенные порты.

Ответ №1:

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

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

Комментарии:

1. В документации также говорится: «Например, функция может быть выполнена успешно, даже если драйвер не выделяет буфер, если какая-либо другая часть системы обеспечивает эквивалентную функциональность». Однако я предполагаю, что это всего лишь пример, а не гарантия. Спасибо за идею с перекрытием ввода-вывода.

2. В Windows 7 существует последовательность щелчков мышью по различным значкам, которые отображают размер буфера данного Com-порта. На данный момент я не могу вспомнить эту последовательность. Я знаю, что делал это раньше. Я спросил об этом у суперпользователя и не получил ответа. Когда я задал вопрос на этом сайте, пользователь с репутацией более 41 000 мгновенно отругал меня за это, поэтому я снял вопрос. У нас есть приложение, которое ведет себя неправильно, и это знание (т. Е. Размер буфера com-порта) из самой Win’7, а не из нашего собственного приложения, очень помогло бы нам. Спасибо, если кто-нибудь когда-нибудь получит это сообщение.

3. @User.1: вероятно, не существует какого-либо общего способа определения фактического размера буфера передачи. Вам нужно будет просмотреть документацию (если таковая имеется) для конкретного используемого драйвера устройства.