Один из старейших стандартов последовательного асинхронного обмена цифровой информацией – RS-232. Его реализация в ПК выполнена через специальный разъем – COM-порт. Несмотря на наличие новых и более быстрых способов коммуникации до сих пор COM-порт находит применение, в частности — при работе модема. Иногда при этом необходимо производить синхронизацию скорости приема и передачи данных во избежание потери информации. Установить требуемую скорость COM-порта можно как программно, так и стандартными средствами ОС Windows.

Инструкция
При работе с модемом измените скорость COM-порта в настройках параметров устройства. Для этого в меню «Пуск» выберите пункт «Панель управления» и откройте ярлык «Телефон и модем». В появившемся окне во вкладке «Модемы» выберите нужное устройство и кликните по кнопке «Свойства».
Перейдите во вкладку «Модем» и в выпадающем списке «Скорость порта для модема» установите желаемую скорость передачи данных для используемого COM-порта. Этот параметр не является показателем максимальной скорости соединения через модем. Но, изменив значение, вы зададите скорость соединения, превысить которую, модем при подключении уже не сможет.
Для того чтобы изменить скорость другого COM-порта, перейдите во вкладку «Дополнительные параметры связи». Нажмите на кнопку «Дополнительные параметры» и в появившемся окне выберите в выпадающем списке «Номер COM-порта» то устройство, которое вам необходимо использовать для коммуникации с помощью модема. Следует учесть, что данная возможность актуальна только в том случае, если вы физически переключили кабель модема на разъем другого COM-порта.
Во вкладке «Дополнительные параметры связи» предыдущего диалогового окна свойств модема нажмите на кнопку «Изменить умолчания». На экране появится окно, перейдите в нем во вкладку «Общие», где находятся элементы с параметрами вызова и подключения линии данных. В выпадающем списке «Скорость порта» задайте требуемую максимальную скорость связи для передачи данных через модем.
Видео по теме
Обратите внимание
Настоящая скорость обмена данными при работе модема может быть существенно ниже, чем установленный вами показатель. Это связано с тем, что на передачу и прием битовой информации оказывает влияние большое количество факторов, в общем случае снижающих скорость работы. В частности, это может быть качество используемого кабеля, расстояние от источника до приемника и различные помехи на линии.
Источники:
- как изменить номер порта
Войти на сайт
или
Забыли пароль?
Еще не зарегистрированы?
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Содержание
- Изменение скорости работы COM порта
- Изменить скорость com порта windows 10
- Изменить скорость com порта windows 10
- Обратная Связь, Стабилизация, Регулирование, Компенсация
- Первичные и Вторичные Химические Источники Питания
- Высоковольтные Устройства — High-Voltage
- Электрические машины, Электропривод и Управление
- Индукционный Нагрев — Induction Heating
- Системы Охлаждения, Тепловой Расчет – Cooling Systems
- Моделирование и Анализ Силовых Устройств – Power Supply Simulation
- Компоненты Силовой Электроники — Parts for Power Supply Design
- Интерфейсы
- Форумы по интерфейсам
- Поставщики компонентов для электроники
- Поставщики всего остального
- Компоненты
- Майнеры криптовалют и их разработка, BitCoin, LightCoin, Dash, Zcash, Эфир
- Обсуждение Майнеров, их поставки и производства
- Дополнительные разделы — Additional sections
- Встречи и поздравления
- Ищу работу
- Предлагаю работу
- Куплю
- Продам
- Объявления пользователей
- Общение заказчиков и потребителей электронных разработок
Приветствую всех. Занялся я, значит, созданием программы для работы с физическим устройством. Сие устройство «общается» по ГОСТ IEC 61107-2011 в режиме С. Если кто-то не знает процедуру обмена информацией по этому ГОСТ, то вкратце расскажу о ней применительно к моему устройству.
В моем устройстве обмен происходит через виртуальный COM порт. Все настройки порта, кроме скорости, остаются одни и те же на всем протяжении процедуры обмена. Вначале программа отправляет устройству запрос определенного формата на скорости 300 бод (первый блок сверху на рисунке) и ждет ответ от устройства на той же скорости (второй блок на рисунке). Далее отправляется любой из 2-х запросов (чтение или программирование), определяющих дальнейший режим работы, так же на скорости 300 бод (запрос а) или б) на рисунке). Кроме этого, в этом же запросе определяется выбор дальнейшей скорости обмена (переключение скорости работы интерфейса устройства). Ответ на этот запрос устройство присылает уже на выбранной скорости (часть рисунка Z бод).
Проблема следующая. Если я не меняю скорость интерфейса устройства, то все работает хорошо. Если же меняю, и одновременно меняю скорость работы COM порта, то ответ от устройства не приходит. Вернее он точно приходит, но я не могу получить его в COM порту. Может я не правильно изменяю скорость COM порта?
Как узнать скорости COM-порта?
Здравствуйте! Подскажите пожалуйста, как из приложения, зная номер COM-порта получить список.

Здравствуйте. Подскажите, есть ли возможность сбросить скорость консольного порта на плате.
вопрос по скорости ком порта
есть оригинальная программа для обмена данными с сотовым телефоном. но версия моего аппарата не.
Как узнать доступные скорости COM-порта?
Здравствуйте. Долго не мог выбрать на форуме подходящий для данного вопроса раздел и решил.
Может быть для изменения скорости порта без его закрытия необходимо чтобы он был открыт в асинхронном режиме? Сейчас он открывается в синхронном.
Добавлено через 19 часов 39 минут
Для моего устройства есть заводская программа. Я запустил монитор COM порта и выполнил обмен с помощью заводской программы. Как я и описывал, второй запрос идет на скорости 300, а ответ на этот запрос уже на скорости 9600. То есть устройство дает ответ (я уж начал в этом сомневаться).
Далее по монитору COM порта я сравнил процесс обмена и настройки COM порта при работе заводской программы и моей поделки. Логи оказались идентичными!
Вот лог COM порта при работе заводской программы:
COM открыт
Unable to add string #8
Скорость передачи 300
RTS включен
DTR включен
Биты данных=7, Стоповые биты=1, Четность=Even
Служ. символы: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
Контроль передачи: ControlHandShake=(DTR_CONTROL), Замена=(TRANSMIT_TOGGLE, RTS_CONTROL), Лимит Xon=2048, Лимит Xoff=512
RTS включен
Очистка порта: RXCLEAR
2F 3F 21 0D 0A
2F 45 4B 54 35 43 45 33 30 31 76 37 0D 0A
Очистка порта: RXCLEAR
06 30 35 31 0D 0A
Очистка порта: RXCLEAR
Скорость передачи 9600
RTS включен
DTR включен
Биты данных=7, Стоповые биты=1, Четность=Even
Служ. символы: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
Контроль передачи: ControlHandShake=(DTR_CONTROL), Замена=(TRANSMIT_TOGGLE, RTS_CONTROL), Лимит Xon=2048, Лимит Xoff=512
DTR включен
01 50 30 02 28 54 45 53 54 49 4E 47 5F 43 4F 55 4E 54 45 52 29 03 73
Очистка порта: RXCLEAR
01 52 31 02 53 4E 55 4D 42 28 29 03 5E
02 53 4E 55 4D 42 28 30 30 38 38 34 30 30 33 38 30 30 30 30 30 32 29 0D 0A 03 61
Очистка порта: RXCLEAR
01 42 30 03 75
Очистка порта: RXCLEAR
COM закрыт
Теперь для меня вообще загадка почему я после переключения скорости не получаю ответ от устройства


| [ | Tags | | | Грабли, Программирование, Электроника | ] |
Эта идиотская проблема отняла два дня моей жизни, так что оставлю это тут, для тех кто будет гуглить также как это делал я и ничего не найдет.
Ключевые слова для поиска:
— Задержки при чтении из ком порта и рс-232
— Низкая скорость обмена по ком порту и рс-232
— read delays com port RS-232
— winapi c# serialport port driver
— COMMPROP COMMTIMEOUTS FTDI Latency time
Суть проблемы — писал программу по общению железки с компьютером через виртуальный ком порт (FTDI). Общение — небольшими пактами по несколько байт. На прием каждого пакета уходило около 20 мс. При этом мне необходимо передавать около 200 пакетов в секунду, что значит, что задержка на один пакет не должна превышать 5мс, а лучше — меньше. Стал смотреть в чем дело — задержка возникала при чтении из ком порта с помощью стандартного класса serial port .NET Стал копаться дальше — стало понятно, что проблема с буферизацией и таймаутами. В драйвере есть некоторый софтверный буфер и о принятых байтах драйвер сообщает не сразу, а когда этот буфер заполняется или когда проходит таймаут после последнего принятого байта. Стал копать в сторону таймаутов. Функционал класса serialport далеко не безупречен и не позволяет полностью контролировать настройки драйвера, в то время как стандартные функции winapi позволяют. Стал копать в сторону реализации класса для работы с ком портом на основе импортированных из winapi функций. С учетом того что я на C#, да и вообще под винду на PC прогаю вторую неделю как — это было не очень просто для понимания. Нашел сторонний класс, прикрутил к своей программе и, ничего не изменилось. Стал смотреть дальше — в настройках ком порта, если нажать на кнопочку «дополнительно» то можно увидеть такое окошко:
Поначалу я больше обращал внимание на размер буфера, но потом увидел, что если поменять «Время ожидания» на 1мс, то передача становится практически мгновенной. Отлично, осталось найти, как это значение поменять из программы. написал импорт функций винапи, которые позволили загрузить и посмотреть все структуры для настройки ком порта. Посмотрел — нигде нет этих пресловутых 16мс. Стал гуглить на русском — ноль информации, кроме как советы снизить «время ожидания» вручную. Нашел как окошко выглядит на английском, поле называется Latency time. Это очень быстро привело к ответу на все вопросы. Оказывается это поле есть только у ком портов FTDI. Настроить ее через винапи и тем более класс serialport .NET нельзя!
Зато можно вот так:
В самом FTDI пишут:
http://www.ftdichip.com/Support/Knowledgebase/index.html?an232b_04adjlatency.htm
FTDI’s R, C and BM series chips allow the latency timer to be changed from 16 milliseconds to any value from 1 to 255 milliseconds, in 1 millisecond increments. When using the FTDI Virtual COM Port driver the latency timer can be set in the port properties page. In Windows, the port properties page is accessed via the Control Panel > System > Device Manager. For Windows 2000 and XP, the initial value of the latency timer can also be pre-configured in ftdiport.inf by changing the value of the last number in the following line:
where again, 16 milliseconds is the default value.
Есть ли такая радость у других преобразователей — не знаю, если кто проверит на CP2102 и прочих — скажу спасибо 🙂
Плюсы:
-решил проблему;
-узнал много нового про то как работает винда, идет взаимодействие с драйверами и т.п.;
-немного поработал с winapi:
Минусы:
-чуть не сломал мозг;
-потратил на эту хрень два дня жизни.
П.С. Что интересно — если гуглить про задержки при работе с ком портом — можно найти несколько подобных проблем, возникавших у людей, причем практически все они без решения. Но нигде, нигде я не видел упоминаний про FTDI или про latency timer.
П.С.2 особенно доставили некоторые комментаторы, толком не разбирающиеся в вопросах, но пишущие на форумах что-то вроде «ком порт — очень медленное устройство, при работе с современными компьютерами проблем с задержками быть не может». Ха-ха. Компьютер конечно быстрее, но только сделано все слишком уж громоздко. МК отвечает на запрос компьютера за несколько десятков микросекунд максимум. Компьютер с виндой, которой до реального времени как до луны — отвечает в течение миллисекунд — минимум!
П.С.3 Попробуйте создать файл с именем com1.txt, на рабочем столе, например 😉
UPD: Грязный хак! Как гласит документация на FTDI — сигналом для отправки буфера кроме всего вышеописанного является изменение одной из хардверных линий — CTS/DSR/DCD/RI. Соответственно достаточно дергать одну из этих линий в конце каждого пакета или же, поступить еще брутальнее — просто закоротить эту линию с RX. Проверенно, работает 🙂
Источники питания электронной аппаратуры, импульсные и линейные регуляторы. Топологии AC-DC, DC-DC преобразователей (Forward, Flyback, Buck, Boost, Push-Pull, SEPIC, Cuk, Full-Bridge, Half-Bridge). Драйвера ключевых элементов, динамика, алгоритмы управления, защита. Синхронное выпрямление, коррекция коэффициента мощности (PFC)
Обратная Связь, Стабилизация, Регулирование, Компенсация
Организация обратных связей в цепях регулирования, выбор топологии, обеспечение стабильности, схемотехника, расчёт
Первичные и Вторичные Химические Источники Питания
Li-ion, Li-pol, литиевые, Ni-MH, Ni-Cd, свинцово-кислотные аккумуляторы. Солевые, щелочные (алкалиновые), литиевые первичные элементы. Применение, зарядные устройства, методы и алгоритмы заряда, условия эксплуатации. Системы бесперебойного и резервного питания
Высоковольтные Устройства — High-Voltage
Высоковольтные выпрямители, умножители напряжения, делители напряжения, высоковольтная развязка, изоляция, электрическая прочность. Высоковольтная наносекундная импульсная техника
Электрические машины, Электропривод и Управление
Электропривод постоянного тока, асинхронный электропривод, шаговый электропривод, сервопривод. Синхронные, асинхронные, вентильные электродвигатели, генераторы
Индукционный Нагрев — Induction Heating
Технологии, теория и практика индукционного нагрева
Системы Охлаждения, Тепловой Расчет – Cooling Systems
Охлаждение компонентов, систем, корпусов, расчёт параметров охладителей
Моделирование и Анализ Силовых Устройств – Power Supply Simulation
Моделирование силовых устройств в популярных САПР, самостоятельных симуляторах и специализированных программах. Анализ устойчивости источников питания, непрерывные модели устройств, модели компонентов
Компоненты Силовой Электроники — Parts for Power Supply Design
Силовые полупроводниковые приборы (MOSFET, BJT, IGBT, SCR, GTO, диоды). Силовые трансформаторы, дроссели, фильтры (проектирование, экранирование, изготовление), конденсаторы, разъемы, электромеханические изделия, датчики, микросхемы для ИП. Электротехнические и изоляционные материалы.
Интерфейсы
Форумы по интерфейсам
все интерфейсы здесь
Поставщики компонентов для электроники
Поставщики всего остального
от транзисторов до проводов
Компоненты
Закачка тех. документации, обмен опытом, прочие вопросы.
Майнеры криптовалют и их разработка, BitCoin, LightCoin, Dash, Zcash, Эфир
Обсуждение Майнеров, их поставки и производства
наблюдается очень большой спрос на данные устройства.
Дополнительные разделы — Additional sections
Встречи и поздравления
Предложения встретиться, поздравления участников форума и обсуждение мест и поводов для встреч.
Ищу работу
ищу работу, выполню заказ, нужны клиенты — все это сюда
Предлагаю работу
нужен постоянный работник, разовое предложение, совместные проекты, кто возьмется за работу, нужно сделать.
Куплю
микросхему; устройство; то, что предложишь ты 🙂
Продам
есть что продать за деньги, пиво, даром ?
Реклама товаров и сайтов также здесь.
Объявления пользователей
Тренинги, семинары, анонсы и прочие события
Общение заказчиков и потребителей электронных разработок
Обсуждение проектов, исполнителей и конкурсов
Открыв
окно свойств порта и выбрав вкладку
Настройка, увидим множество опций
(рис. 4).

Рис.4 – Окно настройки com-порта
Скорость
— в этом пункте выбираем скорость
обмена между устройством и ПК.
Биты
данных —
сколько бит передавать за один раз
(между старт-битом и стоп-битом).
Четность —
выбор способа контроля четности. При
передаче к числу добавляется еще один
бит, дополняющий количество единиц в
числе до четного или нечетного (это уже
как выбрано в режиме передачи). Этот бит
становится младшим разрядом передаваемого
числа и принимает значение 1, если у
нас нечетное число единиц, и 0, если
четное. При проверке на четность, в
случае если мы приняли нечетное число
единиц (при проверке на нечетность —
наоборот), порт передает устройству
информацию об ошибке и просит повторить
передачу.
Стоповые
биты —
количество стоп-бит, необходимых для
правильного распознавания конца байта.
Управление
потоком —
выбор режима управления потоком
(аппаратного или программного). В режиме
программного управления, при определении
ошибки, требуется некоторое время, чтобы
отправить сигнал XOFF и приостановить
прием, но за это время может произойти
передача нескольких байт, которые будут
утеряны (в случае отсутствия буфера
принимаемых данных).
В
пункте Дополнительно
можно выбрать объем буферов FIFO либо
отключить их вообще (что не рекомендуется).
Совет.
Если у вас все нормально работает, не
меняйте настройки, стоящие по умолчанию!
Менять их необходимо тогда, когда этого
требует устройство (о чем, наверняка,
будет подробно сказано в инструкции к
нему).
Таблица 2 –
Ресурсы com-портов
|
Номер COM порта |
Используемые |
Номер IRQ |
|
COM1 |
3F8h — 3FFh |
IRQ4 |
|
COM2 |
2F8h — 2FFh |
IRQ3 |
|
COM3 |
3E8h — 3EFh |
IRQ4 |
|
COM4 |
2E8h — 2EFh |
IRQ3 |
2.2Работа с сom-портом из-под Win32
С портами из-под
Win32 работают так же, как и с обычными
файлами, используя при этом всего
несколько специфичных функций WinAPI.
Однако коммуникационный порт — это
не совсем обычный файл. Для него, например,
нельзя выполнить позиционирование
файлового указателя, или же создать
порт, если таковой отсутствует.
Любая работа с
портом начинается с его открытия. Для
этого используется файловая функция
WinAPI.
C
последовательными портами в Win32 работают
как с файлами. Причем используют только
функции API Win32.
Начинается работа
с открытия порта как файла, причем для
асинхронного режима ввода-вывода
возможен только один вариант:
HANDLE
handle = CreateFile(«COM1», GENERIC_READ | GENERIC_WRITE,
NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
Других вариантов
быть не может, поэтому не будем
рассматривать параметры этой функции
подробно, единственное, что можно сделать
— это заменить “COM1” на “COM2”.
При успешном
открытии порта функция возвращает
дескриптор handle, с которым и будем работать
в дальнейшем. При неудачном открытии
порта функция вернет значение
INVALID_HANDLE_VALUE.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Может быть для изменения скорости порта без его закрытия необходимо чтобы он был открыт в асинхронном режиме? Сейчас он открывается в синхронном.
Добавлено через 19 часов 39 минут
Для моего устройства есть заводская программа. Я запустил монитор COM порта и выполнил обмен с помощью заводской программы. Как я и описывал, второй запрос идет на скорости 300, а ответ на этот запрос уже на скорости 9600. То есть устройство дает ответ (я уж начал в этом сомневаться).
Далее по монитору COM порта я сравнил процесс обмена и настройки COM порта при работе заводской программы и моей поделки. Логи оказались идентичными!
Вот лог COM порта при работе заводской программы:
Кликните здесь для просмотра всего текста
<2016.10.16 10:39:50.431 SYS>
COM открыт
<2016.10.16 10:39:50.431 SYS>
Unable to add string #8
<2016.10.16 10:39:50.431 SYS>
Скорость передачи 300
<2016.10.16 10:39:50.447 SYS>
RTS включен
<2016.10.16 10:39:50.447 SYS>
DTR включен
<2016.10.16 10:39:50.447 SYS>
Биты данных=7, Стоповые биты=1, Четность=Even
<2016.10.16 10:39:50.447 SYS>
Служ. символы: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
<2016.10.16 10:39:50.447 SYS>
Контроль передачи: ControlHandShake=(DTR_CONTROL), Замена=(TRANSMIT_TOGGLE, RTS_CONTROL), Лимит Xon=2048, Лимит Xoff=512
<2016.10.16 10:39:50.447 SYS>
RTS включен
<2016.10.16 10:39:56.894 SYS>
Очистка порта: RXCLEAR
<2016.10.16 10:39:56.894 TX>
2F 3F 21 0D 0A
<2016.10.16 10:39:57.316 RX>
2F 45 4B 54 35 43 45 33 30 31 76 37 0D 0A
<2016.10.16 10:39:57.785 SYS>
Очистка порта: RXCLEAR
<2016.10.16 10:39:57.785 TX>
06 30 35 31 0D 0A
<2016.10.16 10:39:58.019 SYS>
Очистка порта: RXCLEAR
<2016.10.16 10:39:58.019 SYS>
Скорость передачи 9600
<2016.10.16 10:39:58.019 SYS>
RTS включен
<2016.10.16 10:39:58.019 SYS>
DTR включен
<2016.10.16 10:39:58.019 SYS>
Биты данных=7, Стоповые биты=1, Четность=Even
<2016.10.16 10:39:58.019 SYS>
Служ. символы: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
<2016.10.16 10:39:58.019 SYS>
Контроль передачи: ControlHandShake=(DTR_CONTROL), Замена=(TRANSMIT_TOGGLE, RTS_CONTROL), Лимит Xon=2048, Лимит Xoff=512
<2016.10.16 10:39:58.019 SYS>
DTR включен
<2016.10.16 10:39:58.457 RX>
01 50 30 02 28 54 45 53 54 49 4E 47 5F 43 4F 55 4E 54 45 52 29 03 73
<2016.10.16 10:39:58.519 SYS>
Очистка порта: RXCLEAR
<2016.10.16 10:39:58.519 TX>
01 52 31 02 53 4E 55 4D 42 28 29 03 5E
<2016.10.16 10:39:58.738 RX>
02 53 4E 55 4D 42 28 30 30 38 38 34 30 30 33 38 30 30 30 30 30 32 29 0D 0A 03 61
<2016.10.16 10:39:58.835 SYS>
Очистка порта: RXCLEAR
<2016.10.16 10:39:58.835 TX>
01 42 30 03 75
<2016.10.16 10:39:59.053 SYS>
Очистка порта: RXCLEAR
COM закрыт
Теперь для меня вообще загадка почему я после переключения скорости не получаю ответ от устройства
Одна из базовых операций с микросхемами FT232R, FT2232 (в режиме UART) и FT232B это установка скорости виртуального порта UART (Baud Rate). В этом апноуте (перевод [1]) описываются различные способы конфигурирования скоростей чипов FTDI. Также здесь описывается, как использовать нестандартные скорости UART микросхем FTDI, включая так называемую технику псевдонимов (aliasing) для стандартных скоростей, когда одна скорость подменяется на другую.
Второе поколение микросхем FT232B USB UART добавило дополнительную гранулярность для делителя, используемого для генерации требуемой скорости устройства. Это позволило реализовать большее количество возможных скоростей FT232B в сравнении с предыдущей реализацией FT8U232AM.
[Установка Baud Rate]
Когда используются драйверы виртуального COM-порта (FTDI Virtual COM Port, сокращенно VCP), скорость (Baud Rate) может быть установлена в Менеджере Устройств операционной системы Windows, или из приложения, которое работает с COM-портом. Когда Baud Rate устанавливается из программы приложения, то это делается так же, как и для стандартного COM-порта Windows — путем простой передачи требуемого значения Baud Rate в порт с помощью вызова Windows VCOMM API функции или с помощью библиотеки COM-порта. Этим способом могут быть установлены как стандартные, так и нестандартные значения Baud Rate.
При использовании драйвера прямого доступа D2XX компании FTDI функция FT_SetBaudRate [] может быть использована для установки как как стандартных, так и нестандартных значений Baud Rate.
Если нужна нестандартная скорость Baud Rate, то требуется определить по формуле (она приведена в этом апноуте), можно ли достичь нужной скорости с определенной точностью. Если требуемое значение Baud Rate установить можно, то оно просто предается драйверу как обычное значение скорости, и требуемый делитель будет вычислен драйвером самостоятельно. Для D2XX больше не требуется обязательное использование функции FT_SetDivisor, однако её реализация оставлена для сохранения обратной совместимости с уже готовым ПО.
Вычисление Baud Rate. Скорость виртуального COM-порта для микросхем FT232R, FT2232 (в режиме UART) или FT232B генерируется с использованием внутренней тактовой частоты чипа 48 МГц. Это входная частота для внутренней схемы генератора Baud Rate, где она делится на 16 и затем поступает на прескалер как частота тактов 3 МГц. Затем 3 МГц делится с нужным коэффициентом, чтобы получить требуемую скорость Baud Rate для встроенной схемы UART. Значение делителя определяется целым коэффициентом плюс дополнительным дробным коэффициентом. Старая реализация FT8U232AM допускала только три возможных дробных коэффициента делителя — 0.125, 0.25 или 0.5. Более современные микросхемы FT232R, FT2232 (в режиме UART) и FT232B поддерживают еще 4 дополнительных дробных коэффициента прескалера — 0.375, 0.625, 0.75 и 0.875. Таким образом получаются следующие возможные для делителя Baud Rate (здесь n целое число в диапазоне от 2 до 16384):
Делитель = n + 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875
Замечание: если Делитель равен 1 и 0, то это специальные случаи. Делитель = 0 даст скорость 3 MBaud, Делитель = 1 даст скорость 2 MBaud. Использование дробных коэффициентов между значениями Делителя 0 .. 2 не допускается.
Таким образом, необходимое значение делителя для определенного значения Baud Rate находят путем деления 3000000 на значение Baud Rate.
Точное значение Baud Rate может быть недостижимо, однако пока реальное используемое значение Baud Rate находится в пределах точности +/-3% от требуемого Baud Rate, то последовательный линк связи должен работать без ошибок. Если драйверу передается значение Baud Rate, которое не позволяет применить точный коэффициент деления, то выбирается максимально близкий коэффициент из возможных, чтобы полученная скорость Baud Rate находилась в пределах погрешности +/-3% от требуемой.
Пример: требуется нестандартная скорость 490000 бод. Требуемое значение делителя:
3000000 / 490000 = 6.122
Ближайшее допустимое значение делителя 6.125, что даст реальную скорость 3000000 / 6.125 = 489795.9, что хорошо укладывается в предел возникновения ошибок +/-3%. Таким образом, можно передать драйверу 490000, и устройство будет осуществлять безошибочный обмен данными.
[Aliasing Baud Rates]
Файл настроек драйвера FTDIPORT.INF содержит записи, которые используются в качестве делителей для стандартных скоростей. Путем изменения этих значений можно устроить псевдоним (alias) стандартных скоростей, которые в реальности будут функционировать с нестандартными значениями скорости. Например, таким способом можно заменить стандартную скорость 115 kBaud на 512 kBaud. Тогда пользователи FT232R, FT2232 (в режиме UART) или FT232B для работы на скорости 512 kBaud должны выбрать стандартную скорость 115 kBaud. Технология подмены скоростей называется псевдонимами скоростей (Aliasing Baud Rates, алиасинг скорости).
Алиасинг с использованием оригинальных дробных делителей. Есть две секции файла FTDIPORT.INF, которые можно поменять — одна для Windows 98 и Windows Millennium Edition (Windows ME), и другая для Windows 2000 и Windows XP. Запись для Windows XP показана ниже, где соответствующие поля показаны жирным шрифтом. Запись для Windows 98/Windows ME примерно такая же, и она меняется теми же самыми, описанными ниже шагами. Запись с коэффициентами скоростей находится под заголовком FtdiPort232.HW.AddReg.
[FtdiPort232.NT.HW.AddReg]
HKR,,ConfigData,1,01,00,3F,3F,10,27,88,13,C4,09,E2,04,71,02,38,41,9c,80,4E,C0,34,00,1A,00,
0D,00,06,40,03,80,00,00,d0,80
Каждое поле состоит из пары байтов, указанных в порядке Byte0,Byte1. Биты от 13 до 0 задают целочисленный коэффициент, в то время как биты 16 .. 14 задают дробный коэффициент следующим образом:
15,14 = 00 дробная часть делителя 0
15,14 = 01 дробная часть делителя 0.5
15,14 = 10 дробная часть делителя 0.25
15,14 = 11 дробная часть делителя 0.125
Коэффициент может быть распакован из каждой записи несколькими простыми шагами, как показано в примере ниже для последовательности байт 9c,80:
Шаг 1 — преобразуем байты в 16-битное слово, меняя порядок их следования: 9c,80 => 809c Hex
Шаг 2 — извлекаем дробную часть делителя: 15 = 1, 14 = 0 => дробная часть делителя = 0.25
Шаг 3 — извлекаем целую часть делителя: 13:0 = 009c Hex = 156 Dec
Шаг 4 — комбинируем целую и дробную части делителя: 156.25 Dec
Шаг 5 — делим 3000000 на делитель => 3000000/156.25 = 19200 baud
Список значений для стандартных скоростей:
10,27 => делитель = 10000, скорость = 300 бод
88,13 => делитель = 5000, скорость = 600 бод
C4,09 => делитель = 2500, скорость = 1200 бод
E2,04 => делитель = 1250, скорость = 2400 бод
71,02 => делитель = 625, скорость = 4800 бод
38,41 => делитель = 312.5, скорость = 9600 бод
9C,80 => делитель = 156, скорость = 19230 бод
4E,C0 => делитель = 78, скорость = 38461 бод
34,00 => делитель = 52, скорость = 57692 бод
1A,00 => делитель = 26, скорость = 115384 бод
0D,00 => делитель = 13, скорость = 230769 бод
06,40 => делитель = 6.5, скорость = 461538 бод
03,80 => делитель = 3.25, скорость = 923076 бод
00,00 => ЗАРЕЗЕРВИРОВАНО
D0,80 => делитель = 208.25, скорость = 14406 бод
[920 kbaud для 56 kbaud]
Чтобы задать алиас скорости 920 килобод для стандартной скорости 56 килобод в Windows: поменяйте запись 34,00 на 03,80 (см. значения байт из списка выше).
[197 kbaud для 4800 baud]
Чтобы задать алиас скорости 197 килобод для стандартной скорости 4800 бод в Windows: найдите ближайший подходящий делитель, проверьте точность, с которой этот делитель обеспечивает требуемую скорость, и после этого измените соответствующую запись в INF-файле.
3000000/197000 = 15.228. Самый подходящий делитель 15.25.
3000000/15.25 = 196,721. 196721/197000 соответствует точности 99.8%. Это хорошо укладывается в требуемый допуск 3%.
Установите биты 15:14 в значение 10 для дробной части делителя 0.25, и младшие биты в 0F. После этого замените запись 71,02 на 0F,80.
В результате этих двух изменений запись в FTDIPORT.INF станет следующей:
[FtdiPort232.NT.HW.AddReg] HKR,,ConfigData,1,01,00,3F,3F,10,27,88,13,C4,09,E2,04,0F,80,38,41,9C,80,4E,C0,03,80,1A,00, 0D,00,06,40,03,80,00,00,00,00
Эта запись предназначена для Windows 2000 и Windows XP, те же самые изменения должны быть также повторены в записи для Windows 98/ME.
Алиасинг с использованием дополнительных дробных делителей FT232B. Стандартная таблица скоростей ConfigData файла FTDIPORT.INF поддерживает только оригинальные дробные прескалеры FT8U232AM, но не дополнительные, которые были добавлены с новой реализацией FT232B. Чтобы можно было использовать дополнительные дробные прескалеры, необходима другая запись ConfigData:
[FtdiPort232.NT.HW.AddReg]
HKR,,ConfigData,1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,
41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,
00,00,00,00,D0,80,00,00
Примечание: разработчик должен скопировать эту запись, и вставить её вместо старой записи в FTDIPORT.INF.
В новой версии ConfigData каждое поле стандартной скорости состоит из 4 байт, расположенных следующим образом: Byte0,Byte1,Byte2,Byte3. Биты 13..0 как и раньше определяют целочисленную часть делителя, а биты 16, 15 и 14 определяют дробную часть делителя следующим образом:
16,15,14 = 000 дробная часть делителя 0
16,15,14 = 001 дробная часть делителя 0.5
16,15,14 = 010 дробная часть делителя 0.25
16,15,14 = 011 дробная часть делителя 0.125
16,15,14 = 100 дробная часть делителя 0.375
16,15,14 = 101 дробная часть делителя 0.625
16,15,14 = 110 дробная часть делителя 0.75
16,15,14 = 111 дробная часть делителя 0.875
Обратите внимание, что новый вариант ConfigData отличается от старой только тем, что каждая запись скорости содержит 4 байта вместо 2 байт. Выделенный красным шрифтом байт в ConfigData (пример выше) это байт Flags, и формат этого поля определяется битом 4 байта Flags. В вышеприведенном примере байт Flags = 11 означает, что бит 4 установлен, и используется 4-байтная запись для установки скорости вместо 2-байтной.
Полный делитель может быть извлечен следующими простыми шагами, как показано ниже на примере для последовательности байт 35,40,01,00:
Шаг 1 — изменение порядка байт: 35,40,01,00 => 00014035 Hex
Шаг 2 — извлечение дробной части; 16 = 1, 15 = 0, 14 = 1 => sub-integer = 0.625
Шаг 3 — извлечение целой части: 13:0 = 0035 Hex = 53 Dec
Шаг 4 — комбинирование друг с другом целой и дробной части делителя: 53.625 Dec
Шаг 5 — деление 3000000 на делитель => 3000000/53.625 = 55944 бод
Список значений для стандартных скоростей:
10,27,00,00 => делитель = 10000, rate = 300
88,13,00,00 => делитель = 5000, rate = 600
C4,09,00,00 => делитель = 2500, rate = 1200
E2,04,00,00 => делитель = 1250, rate = 2400
71,02,00,00 => делитель = 625, rate = 4800
38,41,00,00 => делитель = 312.5, rate = 9600
9C,80,00,00 => делитель = 156, rate = 19230
4E,C0,00,00 => делитель = 78, rate = 38461
34,00,00,00 => делитель = 52, rate = 57692
1A,00,00,00 => делитель = 26, rate = 115384
0D,00,00,00 => делитель = 13, rate = 230769
06,40,00,00 => делитель = 6.5, rate = 461538
03,80,00,00 => делитель = 3.25, rate = 923076
00,00,00,00 => ЗАРЕЗЕРВИРОВАНО
D0,80,00,00 => делитель = 208.25, rate = 14406
[920 kbaud для 56 kbaud]
Чтобы задать алиас скорости 920 килобод для стандартной скорости 56 килобод в Windows: поменяйте запись 34,00,00,00 на 03,80,00,00 (см. значения байт из списка выше).
[197 kbaud для 4800 baud]
Чтобы задать алиас скорости 197 килобод для стандартной скорости 4800 бод в Windows: найдите ближайший подходящий делитель, проверьте точность, с которой этот делитель обеспечивает требуемую скорость, и после этого измените соответствующую запись в INF-файле.
3000000/197,000 = 15.228. Самый лучший делитель из имеющихся 15.25.
3000000/15.25 = 196721 бод. 196721/197000 = 99.8%. Это в пределах допуска 3%.
Установите биты 16:15:14 в 010 для дробной части делителя 0.25, и младшие биты в 0F. Получится двоичное число 0000 0000 0000 0000 1000 0000 0000 1111, или шестнадцатеричное 0x0000800F. Переставьте байты обратно 0F,80,00,00, и замените на эти байты старое значение 71,02,00,00.
Фрагмент файла FTDIPORT.INF, где жирным шрифтом показаны внесенные изменения:
[FtdiPort232.NT.HW.AddReg] HKR,,ConfigData,1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,0F,80,00,00,38, 41,00,00,9C,80,00,00,4E,C0,00,00,03,80,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00, 00,00,00,00,D0,80,00,00
Эта запись предназначена для Windows 2000 и Windows XP, те же самые изменения должны быть также повторены в записи для Windows 98/ME.
[Ссылки]
1. AN232B-05 Configuring FT232R, FT2232 and FT232B Baud Rates site:ftdichip.com.
2. Дополнительные функции драйвера FTDI.


