COM-порт (последовательный порт)

COM-порт (последовательный порт)

Вот мы и добрались до COM порта. Но с ним все не так просто как с LPT, и его полноценное использование потребует значительно больших усилий. Главной загвоздкой является и его главное преимущество - передача данных в последовательном виде. Если в LPT байт данных передается по 8-ми линиям по биту на каждую, и состояние каждой линии можно было легко посмотреть, то в COM порту байт данных передается бит за битом по одной линии (относительно земли, конечно) и посмотреть что там передается с помощью одних светодиодов не удастся. Для этого нужно специальное устройство - преобразователь потока последовательных данных в парраллельный, т.н. USART (Universal Synchronous/Asynchronous Receiver Transmitter). Например, он есть в составе материнской платы компьютера, снабженного COM портом, в любом более мение серьезном микроконтроллере.


Надеюсь, вы еще пали духом в освоении COM порта. Все не так уж и мрачно. Некоторые результаты можно получить и без USART. Сформулируем задачу, которую реализуем на начальном этапе работы с COM портом:


"Хочу что бы к компьютеру через COM порт подключался светодиод. Запускаю программу. Далаю какое-то действие в этой программе, светодиод загорается, делаю другое - светодиод тухнет."


Задача довольно специфичная (с учетом того, что USART не используется) и является чистой "самопальщиной", но вполне реализуема и работоспособна. Давайте приступим к ее реализации.


1. COM порт

Опять берем системный блок вашего ПК и смотрим в тыловую часть. Примечаем там 9-ти штырьковй разъем - это и есть COM порт. Реально их может быть неколько (до 4-х). На моем ПК установлено два COM порта (см. фото).


2. Удлинитель COM порта


3. Аппаратная часть

С аппаратной частью нам тоже придется "повозиться", в том смысле что она будет сложнее чем с первым устройством для LPT порта. Дело в том что протокол RS-232 по которому идет обмен данными в COM порту, имеет несколько отличное соотношение логическое состояние - напряжение. Если обычно это логический 0 0 В, логическая 1 +5 В, то в RS-232 это соотношение следующее: логический 0 +12 В, логическая 1 -12 В.

И например, получив -12 В не сразу понятно что с этим напряжением делать. Обычно проводят преобразование уровней RS-232 в ТТЛ (0, 5 В). Самый простой вариант - стабилитроны. Но я предлагаю сделать этот преобразователь на специальной микросхеме. Называется она MAX232.

Теперь давайте посмотрим, а какие сигналы из COM порта мы можем посмотреть на светодиодах? В действительности, в COM порту есть аж 6 независимых линий, представляющих интерес для разработчика устройств сопряжения. Две из них пока для нас недоступны - линии по передаче последовательных данных. А вот оставшиеся 4 предназначены для управления и индикации процесса передачи данных и мы сможем "передалать" их под свои нужды. Две из них предназначены для управления со стороны внешнего устройства и мы их пока трогать не будем, а вот последние две оставшиеся линии мы сейчас и поиспользуем. Они называются:

  • RTS - Запрос на передачу. Линия взаимодействия, которая показывает, что компьютер готов к приему данных.
  • DTR - Компьютер готов. Линия взаимодействия, которая показывает, что компьютер включен и готов к связи.

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

Итак, давайте соберем схему, которая позволит нам проводить задуманные действия.

А вот ее практичекая реализация. Я думаю вы меня простите, что я сделал ее в таком стремном макетном варианте, ибо делать плату для такой "высоко продуктивной" схемы не хочется.


4. Программная часть

Тут все попроще. Давайте создадим Windows приложение в Microsoft Visual C++ 6.0 на основе MFC для управления двумя линиями взаимодействия COM порта. Для этого создаем новый проект MFC и указываем ему имя, например, TestCOM . Далее выбираем вариант построения на основе диалога.

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

Class CTestCOMDlg: public CDialog { // Construction public: CTestCOMDlg(CWnd* pParent = NULL); // standard constructor HANDLE hFile;

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

HFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) { MessageBox("Не удалось открыть порт!", "Ошибка", MB_ICONERROR); } else { MessageBox("Порт успешно открыт", "Ok", MB_OK); }

С помощью стандарной функции Win API CreateFile() открываем COM-порт COM2 . Далее проверяем успешность открытия с выводом информационного сообщения. Вот тут надо сделать важное замечание: COM2 - это в моем компьютере, а на Вашем компьютере Вы могли подключить его к другому COM порту. Соответственно, его имя нужно изменить на то, кокай порт Вы используете. Посмотреть, какие номера портов присутствуют на Вашем компьютере, можно так: Пуск -> Настройка -> Панель управления -> Система -> Оборудование -> Диспетчер устройств -> Порты (COM и LPT) .

В итоге, функция CTestCOMDlg::OnInitDialog() , расположенная в файле TestCOMDlg.cpp , класса нашего диалога должна принять вид:

BOOL CTestCOMDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application"s main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) { MessageBox("Не удалось открыть порт!", "Оштбка", MB_ICONERROR); } else { MessageBox("Порт успешно открыт", "Ok", MB_OK); } return TRUE; // return TRUE unless you set the focus to a control }

Теперь добавим обработчики кнопок управления линиями. Я дал им соответствующие имена: функция, которая устанавливает еденицу на линии DTR - OnDTR1(), 0 - OnDTR0(). Для линии RTS соответственно аналогичным образом. Напомню, что обработчик создается при двойном щелчке на кнопке. В итоге, эти четыре функции должны принять вид:

Void CTestCOMDlg::OnDTR1() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 6); } void CTestCOMDlg::OnDTR0() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 5); } void CTestCOMDlg::OnRTS1() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 4); } void CTestCOMDlg::OnRTS0() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 3); }

Поясню немного как они работают. Как видно, внитри себя они содержат вызов одной и той же Win API функции EscapeCommFunction() с двумя параметрами. Первый из них - это хэндл (HANDLE) на открытый порт, второй - специальный код действия, соответствующий необходимому состоянию линии.

Все, комилируем, запускаем. Если все хорошо, должны увидеть сообщение об успешном открытии порта. Далее, нажатием соответствующих кнопок мигаем светодиодами, подключенными к COM порту.

© Иванов Дмитрий
Декабрь 2006

Передача данных от центрального процессора к любому периферийному устройству и наоборот контролируется заданием запроса на прерывание IRQ...

Прерывания и адреса

Передача данных от центрального процессора к любому периферийному устройству и наоборот контролируется заданием запроса на прерывание (IRQ) и адреса ввода-вывода (I/O address). Для внешнего периферийного устройства запрос на прерывание и адрес ввода-вывода приписываются тому порту, через который оно подсоединяется.

Сами слова "запрос на прерывание" сообщают, что прерывается работа ЦП и ему предписывается заняться данными, поступающими с какого-либо устройства. Всего существует 16 прерываний - от 0 до 15. Все последовательные и параллельные порты, как правило, требуют своего собственного запроса прерывания, за исключением того, что порты СОМ1 и COM3, а также COM2 и COM4 зачастую имеют общий запрос прерывания.

Для каждого порта нужно указывать уникальный адрес ввода-вывода, который подобен почтовому ящику для приходящей на адрес ЦП корреспонденции, в котором она хранится до обработки. Если какой-либо запрос на прерывание или адрес ввода-вывода используются одновременно более чем одним устройством, то ни одно из них не будет работать надлежащим образом и может даже "зависнуть" ПК.

При проблемах с портом проверьте, какие запросы на прерывание и адрес ввода-вывода ему приписаны.

Панель управления - Система - Устройства - Порты СОМ и LPT

Если вы увидите перед какой-либо строчкой желтый кружок с восклицательным знаком внутри, то, возможно, найдете причину "помехи". Выделив строчку, нажмите "Свойства - Ресурсы". В поле "Список конфликтующих устройств" найдите, что вызывает конфликт. Если окажется, что это какая-нибудь старая плата, не поддерживающая Plug & Play, то она будет указана в списке как "Неизвестное устройство".

Чтобы разрешить проблему, измените для одного из устройств-нарушителей запрос на прерывание или адрес ввода-вывода. Если порт находится на системной плате, то используйте для этого программу начальной установки системы System Setup (BIOS).

Для вхождения в System Setup во время запуска ПК нажмите клавишу "Delete", "F1" или иную - узнайте в документации на систему. Во многих программах начальной установки можно назначать запрос на прерывание и адрес ввода-вывода (установить ресурсы) для каждого конкретного порта, отменив старые.

Найдите неиспользуемый запрос на прерывание или адрес ввода-вывода.

Панель управления - Система - Устройства - Компьютер

Вы увидите полный список применяемых ресурсов. Если неиспользуемых запросов на прерывание нет, то попробуйте отключить с помощью System Setup неиспользуемый порт.

После этого...

Система - Устройства - Конфликтующее устройство - Ресурсы

Выключите функцию "Автоматическая настройка". В окне "Перечень ресурсов" выберите тип ресурса, нажмите кнопку "Изменить" и в поле "Значение" задайте новое (неиспользуемое) значение запроса на прерывание или адрес ввода-вывода.

Установка параметров паралельных портов

Параллельные порты обозначаются аббревиатурой LPT. Компьютер автоматически приписывает каждому обнаруженному параллельному порту адреса от LPT1 до LPT3.

Если вы устанавливаете второй параллельный порт, убедитесь, что он не использует уже имеющийся запрос на прерывание. В некоторых компьютерах LPT1 и LPT2 по умолчанию применяют IRQ7. С помощью Диспетчера устройств установите IRQ5 для LPT2. Если это невозможно, то используйте программу Setup CMOS вашей системы.

Стандартные установки ресурсов параллельных портов

LPT-порт Запрос на прерывания Адрес ввода-вывода
LPT1 IRQ7 ЗВС
LPT2 IRQ7 378
LPT3 IRQ5 278

Установка параметров последовательных портов

Каждый последовательный порт идентифицируется с помощью одного из восьми возможных СОМ-адресов - СОМ1, COM2 и т. д., каждому из которых соответствуют свой уникальный адрес ввода-вывода и запрос на прерывание.

Будьте внимательны при установке в ПК устройства, требующего СОМ-порта. Порты СОМ1 и COM2 имеют стандартные адреса ввода-вывода и запросы на прерывание, которые нигде не должны изменяться (обычно могут быть изменены только в программе Setup CMOS вашего ПК). Если для нового устройства требуется назначить порт СОМ1 или COM2, то при загрузке ПК войдите в программу Setup и либо отключите последовательный порт, приписанный к СОМ1 или COM2, либо, если нужно освободить соответствующие установки для добавляемого устройства, измените идентифицирующие его запрос на прерывание и адрес ввода-вывода.

Заметьте, что все стандартные адреса ввода-вывода используют только третье и четвертое прерывания. Поскольку два устройства не должны использовать один и тот же запрос на прерывание, то постарайтесь для новых внешних устройств приписать портьте COM3 по COM3, вручную устанавливая запросы на прерывание и адреса ввода-вывода с помощью Диспетчера устройств (диалоговое окно "Свойства: Система" ).

Стандартные установки ресурсов последовательных портов

СОМ-порт Запрос на прерывание Адрес ввода-вывода
СОМ1 IRQ4 3F8
COM2 IRQ3 2F8
COM3 IRQ4 ЗЕ8
COM4 IRQ3* 2Е8
СОМ5 IRQ4* ЗЕО
СОМ6 IRQ3* 2ЕО
СОМ7 IRQ4* 338
СОМ8 IRQ3* 238

* Могут быть установлены с помощью Диспетчера устройств Windows 9x (Свойства: Система)

Оптимизация последовательных портов

Компьютер имеет один либо два встроенных последовательных порта в виде 9-штырькового разъема, обычно расположенных на задней панели компьютера. С помощью такого порта за единицу времени можно передать лишь 1 бит данных, в то время как посредством параллельного - 8 бит. Скорость работы последовательного порта зависит от универсального асинхронного приемо-передатчика (UART), преобразующего проходящий через шину ПК параллельный поток данных в однобитовый.

Как правило, современные ПК поставляются с UART модели 16550. В этом случае максимальная пропускная способность составляет 115 кбит/с, что обеспечивает достаточную полосу пропускания для большинства последовательных устройств. Более старые UART моделей 16450 и 8250 с этой задачей уже не справляются. Но иногда производительности UART 16550 может оказаться недостаточно, ведь некоторые аналоговые модемы обрабатывают сжатые данные со скоростью 230 кбит/с, а адаптеры ISDN - до 1 Мбит/с. Так что, если вам требуется большая скорость передачи данных, покупайте плату расширения с UART модели 16750, способной работать со скоростью 921 кбит/с.

Работа с параллельными портами

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

В основном все ПК поставляются с одним параллельным портом в виде 25-штырькового разъема на задней панели. Чтобы добавить второй порт, необходимо купить контроллер ввода-вывода и установить его в разъем расширения на системной плате. Параллельный порт бывает четырех типов - однонаправленный, двунаправленный, с улучшенными возможностями (ЕРР-порт) и с расширенными возможностями (ЕСР-порт). Для каждого из них характерны различные скорость и возможности. Порты большинства новых ПК поддерживают все четыре режима, и чтобы узнать, какой из них обеспечивает параллельный порт, посмотрите в программе Setup (CMOS Setup utility) вашего ПК раздел периферийных устройств (Integrated peripherals).

Однонаправленный порт иногда называется также SPP-портом. Эта базовая конфигурация пропускает данные со скоростью 40-50 Кбайт/с лишь в одном направлении - к принтеру или другому внешнему устройству.

Двунаправленный порт. Обеспечивает двусторонний обмен данными со скоростью передачи от 100 до 300 Кбайт/с между ПК и внешним устройством. При этом информация о состоянии последнего поступает в компьютер.

Порт с улучшенными возможностями (ЕРР). Разработан для внешних дисководов и сетевых адаптеров, требующих высокой производительности. Обеспечивает скорость передачи данных от 400 Кбайт/с до 1 Мбайт/с и более.

При установке в программе System Setup опции ЕРР предлагаются версии 1.7 и 1.9. Практически для всех периферийных устройств, купленных в последние годы, нужно выбирать 1.9.

Порт с расширенными возможностями (ЕСР). Повышает скорость и расширяет возможности обмена данными между внешним устройством и компьютером. Если принтер и иное периферийное устройство поддерживают ЕСР, то они непосредственно выдают сообщения о состоянии устройств и ошибках.

Если в программе. System Setup задать опцию ЕСР, то появится строчка для выбора DMA-канала (канал непосредственного доступа к памяти, direct memory access). Необходимо задать его так же, как и при запросе на прерывание. Чтобы предотвратить возникновение конфликтов DMA-каналов, просмотрите свободные из них в окне "Свойства: Компьютер" , как описано выше. Если конфликта не избежать, то вернитесь к двунаправленному режиму порта.

Лучший порт для урагана данных.

В новых системах и периферийных устройствах параллельные и последовательные порты стали заменять универсальной последовательной шиной (Universal Serial Bus , USB). С ее помощью можно достичь скорости передачи данных до 12 Мбит/с, а также подключать при наличии всего одного порта клавиатуры, мониторы, мыши и многие другие (до 127) устройства, которые, как и с решающим сходные задачи SCSI-интерфейсом, могут быть соединены "цепочкой" . При этом используется всего один запрос прерывания. USB-шину можно устанавливать и на более старые компьютеры, купив соответствующую плату расширения.

Ой, а что это за штучка? Зачем она нужна? Ничего, если я пальцем потрогаю? Что? Лучше не надо? Хорошо, не буду. Но мне страсть как интересно: разъём в компьютере есть, а никто ничего к нему почему-то не подключает. Как он вообще называется? Порт? Ух ты! Класс! А что это такое?..

Этот порт также называется серийным (Serial port ), хотя сокращение «COM» на самом деле означает «коммуникационный» - Communication port (изначально предназначен для двустороннего движения данных - настоящей коммуникации). А ещё чаще его именуют последовательным , поскольку передаёт биты строго один за другим.

Кроме последовательного, в компьютерах есть и параллельный порт, предназначенный, в основном, для подключения принтеров. Его нередко так и называют: принтерный. Там передача данных номинально односторонняя (хотя лишь номинально).

Вполне возможно, COM-порт есть и в вашем компьютере. Это, скорее всего, слегка продолговатое гнездо с девятью контактами в два ряда, пять и четыре штуки в каждом, а также с резьбой для болтиков на концах. К нему полагается кабель с разъёмом, соответственно, с девятью гнёздами, расположенными в такой же конфигурации.

Разъём вставляется в гнездо с контактами и прикручивается вышеуказанными болтиками, чтобы не выпасть. Таким образом можно, к примеру, соединить напрямую два компьютера с помощью нуль-модемного кабеля. Что и делалось раньше, в эпоху первых ПК.

Нынче таким образом подключают спутниковые ресиверы, приборы различных систем безопасности, комплексы управления производственным процессом и прочие заумные устройства.

Вероятно, такой порт есть и в вашем ноутбуке (конечно, если оный имеется у вас в хозяйстве). Он служит, например, для синхронизации с настольным компьютером. Правда, на практике в наши дни такое соединение используется не так уж часто - никто не хочет морочить себе голову с кабелями, ведь можно использовать другие технологии, более современные и эффективные.

Нынче для коммуникации с разными устройствами всё чаще используют USB-порт (он тоже, кстати, фактически последовательный). Мобильные модемы, принтеры, адаптеры Wi-Fi - всё большее количество приборов подключается именно через USB.

Кроме того, при наличии таких технологий как Ethernet и FireWire (для Apple), соединять компьютеры проводами через COM-порты не так уж целесообразно. Ну а если вспомнить о Bluetooth (что переводится как «синий зуб»), то и вовсе можно отправлять последовательный порт в музей.

Впрочем, операционная система Windows по-прежнему называет свои каналы передачи информации не иначе как COM1, COM2 и так далее.

Почему? Потому что драйверы, к примеру, для того же Bluetooth, могут представляться системе именно как COM-порты. Мол, а вот и мы, прошу любить и жаловать, извольте назначить нам каналы для обмена данными. Ну и что, что мы как бы не совсем настоящие? Всё равно придётся нас обслуживать.

В Unix (и её разновидностях вроде Linux) тоже есть некоторые особенности по поводу отношения к подключаемым устройствам. Поскольку Unix считает всё вокруг файлами (даже оборудование!), то и держит свои последовательные порты в виде оных с именами вроде ttyS0, ttyS1, ttyS2 (если это Linux) или ttyu0, ttyu1, ttyu2 (в FreeBSD).

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

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

Коротко говоря, хотя такая штука как COM-порт продолжает существовать с точки зрения операционной системы и даже используется в качестве канала связи виртуально, на практике большинству пользователей можно о нём забыть с совершенно спокойной совестью.

Правда, любознательность - это всегда похвально. Так что спрашивайте, интересуйтесь, изучайте. Но руками без разрешения лучше не трогайте.

Предыдущие публикации:

Иногда приходится решать задачу связи электронного устройства с компьютером, будь то просто обмен данными или удалённое управление. Эта статья описывает, как это можно реализовать, используя последовательный порт. Главным его преимуществом является то, что стандартный программный интерфейс Windows (API) позволяет производить непосредственное управление выходными линиями, давая прямой контроль над ними, и имеет функцию ожидания некоторого события, связанного с COM-портом. Также стандарт RS-232, по которому выполнены COM-порты, допускает подключение и отключение кабелей во время работы устройств (hot plug).

Описание

COM-порт (последовательный порт) – двунаправленный интерфейс, передающий данные в последовательном виде (бит за битом) по протоколу RS-232. Это довольно-таки распространённый протокол, применяемый для связи одного устройства (например, компьютера) с другими посредством проводов длиной до 30м. Уровни логических сигналов здесь отличаются от стандартных: уровень логической единицы – от +5 до +15В, уровень логического нуля – от -5 до -15В, что требует дополнительных преобразований схемы, но обеспечивает хорошую помехоустойчивость.

Рассмотрим 9-пинововый разъём (DB-9M). Ниже представлена его распиновка:

№ вывода Наименование Характер сигнала Сигнал
1 DCD Входной Data carrier detect
2 RxD Выходной Transmit data
3 TxD Входной Receive data
4 DTR Выходной Data terminal ready
5 GND - Ground
6 DSR Входной Data set ready
7 RTS Выходной Request to send
8 CTS Входной Clear to send
9 RI Входной Ring indicator

Больше всего нас будут интересовать пины 2 (передача данных),3 (приём данных) и 5 (земля). Это минимальный набор для возможности двухстороннего общения приборов.

Подробно останавливаться на описании протокола не буду. Для этого есть ГОСТ’ы и т.п. Поэтому мы пойдём дальше и поговорим о том, как же управлять этим зверем.

Применение

Как уже говорилось, уровни ЛС RS-232 отличаются от стандартных уровней ТТЛ. Следовательно, нам необходимо как-то преобразовывать величины напряжений. Т.е. сделать 5В из +15В и 0В из -15В (и наоборот). Один из способов (и, наверное, самый простой) – использование специальной микросхемы MAX232. Она проста в понимании и одновременно может преобразовывать два логических сигнала.

Ниже приведена схема её включения:


Думаю, трудностей быть не должно. Это один из вариантов использования этой микросхемы: передача данных с микроконтроллера на ЭВМ и наоборот. Передаваемый сигнал поступает на ножки Tx IN с одной стороны и на Rx IN с другой. Входные сигналы снимаются с Tx OUT и Rx OUT соответственно.

Программирование

Для начала поговорим о программировании портов на низком уровне. Так будет более правильно. Я очень много нервов потратил, разбираясь с этим интерфейсом, пока не начал вникать в принцип его работы на более низком уровне, нежели простая передача символов. Если будет понятно это, значит и с языками высокого уровня проблем не будет.

Ниже представлены адреса COM-портов, с которыми нам придётся работать:

Название порта Адрес IRQ
COM 1 3F8h 4
COM 2 2F8h 3
COM 3 3E8h 4
COM 4 2E8h 3

Они могут различаться. Установить значения можно в настройках BIOS’а. Это базовые адреса. От них же и будут зависеть адреса регистров, отвечающие за работу портов:

Адрес DLAB Чтение/Запись Аббревиатура Название регистра
+ 0 =0 Write Transmitter Holding Buffer
=0 Read Receiver Buffer
=1 Read/Write Divisor Latch Low Byte
+ 1 =0 Read/Write IER Interrupt Enable Register
=1 Read/Write Divisor Latch High Byte
+ 2 - Read IIR Interrupt Identification Register
- Write FCR FIFO Control Register
+ 3 - Read/Write LCR Line Control Register
+ 4 - Read/Write MCR Modem Control Register
+ 5 - Read LSR Line Status Register
+ 6 - Read MSR Modem Status Register
+ 7 - Read/Write Scratch Register

Первая колонка – адрес регистра относительно базового. Например, для COM1: адрес регистра LCR будет 3F8h+3=3FB. Вторая колонка – DLAB (Divisor Latch Access Bit) бит, определяющий разное назначение для одного и того же регистра.. Т.е. он позволяет оперировать 12-ю регистрами, используя всего 8 адресов. Например, если DLAB=1, то, обращаясь по адресу 3F8h, мы будем устанавливать значение младшего байта делителя частоты тактового генератора. Если же DLAB=0, то, обращаясь по тому же адресу, в этот регистр будет записан передаваемый или принятый байт.

“Нулевой” регистр

Ему соответствуют регистры приёма/передачи данных и установки коэффициента делителя частоты генератора. Как уже было сказано выше, если DLAB=0, то регистр используется для записи принимаемых/передаваемых данных, если же он равен 1, то устанавливается значение младшего байта делителя частоты тактового генератора. От значения этой частоты зависит скорость передачи данных. Старший байт делителя записывается в следующую ячейку памяти (т.е. для порта COM1 это будет 3F9h). Ниже приведена зависимость скорости передачи данных от коэффициента делителя:

Interrupt Enable Register (IER)

Если DLAB=0, то он используется как регистр управления прерываниями от асинхронного адаптера, если DLAB=1, то в нём задаётся старший байт делителя частоты тактового генератора.

Interrupt Identification Register (IIR)

Прерывание – это событие, при котором останавливается выполнение основной программы и начинается выполнение процедуры прерываний. Этот регистр определяет тип произошедшего прерывания.

Line Control Register (LCR)

Это управляющий регистр.

Бит 7 1 Divisor Latch Access Bit – задание скорости обмена данными
0 Обычнй режим (управление прерываниями, приём/передача данных)
Бит 6 Имитировать обрыв линии (посылает последовательность из нескольких нулей)
Биты 3 – 5 Бит 5 Бит 4 Бит 3 Выбор чётности
X X 0 No Parity
0 0 1 Odd Parity
0 1 1 Even Parity
1 0 1 High Parity (Sticky)
1 1 1 Low Parity (Sticky)
Бит 2 Кол-во стоп-битов
0 1 стоп-бит
1 2 стоп-бита при 6,7 или 8 бит данных или 1.5 стоп-бита при 5 битах данных.
Биты 0 And 1 Бит 1 Бит 0 Число битов данных
0 0 5 бит
0 1 6 бит
1 0 7 бит
1 1 8 бит

Проверка чётности подразумевает под собой передачу ещё одного бита – бита чётности. Его значение устанавливается таким образом, чтобы в пакете битов общее количество единиц (или нулей) было четно или нечетно, в зависимости от установки регистров порта. Этот бит служит для обнаружения ошибок, которые могут возникнуть при передаче данных из-за помех на линии. Приемное устройство заново вычисляет четность данных и сравнивает результат с принятым битом четности. Если четность не совпала, то считается, что данные переданы с ошибкой.

Стоп-бит означает окончание передачи данных.

Modem Control Register (MCR)

Регистр управления модемом.

Бит Значение
0 Линия DTR
1 Линия RTS.
2 Линия OUT1 (запасная)
3 Линия OUT2 (запасная)
4 Запуск диагностики при входе асинхронного адаптера, замкнутом на его выход.
5-7 Равны 0

Line Status Register (LSR)

Регистр, определяющий состояние линии.

Бит Значение
0 Данные получены и готовы для чтения, автоматически сбрасывается при чтении данных.
1 Ошибка переполнения. Был принят новый байт данных, а предыдущий ещё не был считан программой. Предыдущий байт потерен.
2 Ошибка чётности, сбрасывается после чтения состояния линии.
3 Ошибка синхронизации.
4 Обнаружен запрос на прерывание передачи "BREAK" – длинная строка нулей.
5 Регистр хранения передатчика пуст, в него можно записать новый байт для передачи.
6 Регистр сдвига передатчика пуст. Этот регистр получает данные из регистра хранения и преобразует их в последовательный вид для передачи.
7 Тайм-аут (устройство не связано с компьютером).

Modem Status Register (MSR)

Регистр состояния модема.

Ну вот и всё. Оперируя этими регистрами, можно напрямую общаться с COM-портом, управлять передачей и приёмом данных. Если вам не хочется возиться с памятью, можно воспользоваться уже готовыми компонентами для различных сред программирования: C++, VB, Delphi, Pascal и т.д. Они интуитивно понятны, поэтому, думаю, здесь не стоит заострять на них внимание.

Последовательный порт это устройства ввода-вывода (I/O device). Как устройство I/O это только путь для передачи данных из компьютера и в него. существует также множество других устройств ввода-вывода, таких как последовательные порты, паралельные порты, контроллеры дисков, сетевые карты, устройства универсальной последовательной шины USB, и т.п. Большинство компьютеров имеют один или два последовательный порта . Какждый имеет 9-ти контактный разъем (иногда 25-ти контактный) (рис.1) на задней стенке системного блока компьютера. Программы могут отсылать данные (байты) через контакт отправки данных (output) и получать байты через другой контакт приема данных (input). Все остальные контакты служат для управления и земли.

) это несколько больше чем просто разъем. Он преобразует данные из паралельного представления в последоватльное и меняет электрическое представление данных. Внутри компьютера, биты данных передаются в паралельном виде (используется несколько проводов для передачи данных одновременно). Последовательный поток данных это последовательность битов всего по одному проводу (такому как провод передачи и приема данных на разъеме последовательного порта). Для того и служит это устройство, чтобы создать такой поток данных из паралельного вида в последовательный (внутри компьютера) и передать на контакт передачи данных (и соответственно наоборот).

Большинство электронных компонентов последовательного порта сосредоточено в одно компьютерном чипе (микросхеме) называемом UART .

Контакты и провода

Старые компьютеры используют 25-ти контактные разъемы, но только 9 контактов реально задействовано на сегодняшний день. Каждый из 9-ти контактов соединен обычно с проводом. за исключением двух проводов для передачи и приема данных, остальные используются для контроля и земли. Напряжение на каждом из контактов и проводов измеряется относительно сигнальной земли. Поэтому минимальное количество проводом для двунаправленной передачи данных - 3. В редких случаях для работы может хватитть и двух проводов (без сигнальной земли), однако это может привести к низкой производительности, и иногда к ошибкам при передаче данных.

Остается еще несколько проводов, которые предназначены только для управления (контроля) и не используются для передачи данных. Все эти сигналы могли бы передаваться по одной линии, но вместо этого, для выделены отдельные провода. Некоторые (или все вместе) эти сигнальные линии называются "линии состояния модема". Линии состояния могут находиться в одном из двух состояний установленном (включено) +12 вольт или сброшенном (выключено) -12 вольт. Одни из этих проводов сигнализируют компьютеру о том, что нужно прекратить передачу данных через последовательный порт. Другие в свою очередь сигнализируют устройству, подключенному к последовательному порту, прекратить передачу даных в компьютер. Если подключенно устройство это модем, то оставшиеся линии могут указывать модуме на то, что нужно занять телефонную линию или сигнализируют компьютеру о том, что соединение было установлено или что есть звонок на телефонной линии (значит кото-то соединиться с компьютером). Смотрите раздел Контакты и сигналы с более полной информацией.

RS-232 или EIA-232, и т.п.

Последовательный порт (serial port ) (не путать с USB) обычно соответствует стандарту RS-232-C , EIA-232-D , или EIA-232-E . Это три обозачения одного и тоже. Основной стандарт RS (рекомендованный стандарт - Recommended Standard) получил префикс EIA (Electronics Industries Association) и позднее EIA/TIA после того как организация EIA было объединена с TIA (Telecommunications Industries Association). Спецификация EIA-232 также охватывает синхронную передачу данных, но в большинстве случаев синхронная передача данных не поддерживается чипами в компьютерах. Обозначение RS устарело, однако до сих пор широко используется. EIA будет использоваться далее на этом сайте более часто. Некоторые документы используют полное обозначение EIA/TIA.

Обмен данными (Скорости передачи данных)

Данные (байты из которых состоят письма, картинки и т.п.) проходят через последовательный порт. Скорости передачи данных (такие как 56k (56000) бит/сек) называются (неверно) "скоростью". Большинство людей неверно говорят "скорость" вместо "коэффициент скорости".

Важно знать, что средняя скорость передачи данных зачастую меньше максимально заявленной. Задержки (или периоды ожидания) и в результате скорость становится меньше. Эти задержки могут увеличиваться в щависимости от типа контроля передачи данных. Даже в лучшем случае всегда есть задержки между байтами, пусть даже и небольшие (несколько микросекунд). Если устройство, соединенное с компьютером через последоватльный порт не может работать на полной скорости, то средняя скорость должна быть уменьшена.

Контроль передачи данных

Контроль передачи данных означает возможность ограничить поток передачи данных через последовательный порт. Для последовательного порта это означает возможность остановить и потом возобновить передачу данных без потери байтов.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows