КОМПЬЮТЕРНЫЕ ПОРТЫ

Сопряжение LPT-порт


Для вывода управляющих сигналов из компьютера служат LPT, COM или USB порты. Примеры программирования портов в Дельфи см. на "PCcontrol".


Следует учитывать, что USB-Lpt адаптеры к принтерам реализуют только часть функций "аппаратного" Lpt порта. Переходник USB-COM более функционален, чем USB-LPT (употребляется для подключения устаревшего принтера), последний адаптер не соответствует полностью аппаратному LPT порту, есть проблемы с адресацией этого порта (при программировании).

Выводы порта можно разделить на четыре группы: это 8 выводов 'земля', обозначены черным цветом, контакты 18-25. Красным цветом обозначены 8 выводов двунаправленного регистра Data, контакты 2-9, программируемого и возможна установка логических уровней (0-5в) извне. Адрес: 0x378 - в 16-ричной системе или 888 в десятичной (на рис. написано &H378 - это тоже самое что и 0x378, первое обозначение присуще языку Pasсal). Осталось еще два регистра. Однонаправленный регистр Status (контакты 10-13, 15). Управлять им можно только извне, через внешнее устройство (имеется в виду изменять данные на нем, читать можно из любого регистра в любую сторону). Он имеет адрес 0x379 - в 16-ричной системе или 889 в десятичной. И регистр Control (контакты 1, 14, 16-17). Он имеет всего 4 контакта и может управляться только программой. Его адрес: 890 в десятичной системе.

Работа из под Delphi. Регистрируем библиотеку inpout32.dll.

uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,StdCtrls;
function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll';
var Port: word; Data: Byte;

Посылка данных из окошек:



Чтения данных:



Допустим, на выводе регистра Data под номером 3 (3 - это номера вывода LPT порта) нужно установить логическую 1 (т.е. чтоб между ножкой и землей было +5 В) и на остальных выводах этого регистра (2,4-9 выводы порта) были нули. В операционных системах, позволяющих получить прямой доступ к регистру, пишем код (опираясь на функцию Out32 библиотеки inpout32.dll):



Ниже размещен пример вывода кода 245:


Считать данные из порта (Inp32 это функция для чтения данных из порта библиотеки inpout32.dll):



На выводах порта 2,4,6-9 сейчас +5 В, а на выводах 3,5 сейчас 0 В (см. рис. выше). Как уже упомянуто выше, в регистр Data данные записать может и внешнее устройство. Исходно, на всех выводах регистра Status (10-13, 15) находится высокий уровень напряжения +5 В. Заземлением можно менять уровень до нуля (подача данных извне). Он имеет инвертированные выводы и рабочими являются биты под номерами 4-7, а 0-3 не используются. Чтение:



После первого замыкания выводов Status, начинают мигать выводы Data и Control. Это связано с тем, что порт LPT предназначен для подключения принтера, а выводы Status он использует, для того, чтобы сообщить компьютеру служебную информацию. Изменения на выводах Status регистрирует драйвер операционной системы. Он же проводит и ответные действия, для нас наблюдаемые в виде периодического изменения состояния других выводов. Тут уж ни чего не поделаешь. Обычно, в начале работы с портом далается замыкание какой-нибудь линии регистра Status на землю, примерно через минуту драйвер утихомирится. После этого порт свободен, и новые операции над регистром Status не приводят к неконтролируемым процессам в порту.

Особенности ввода информации в компьютер через стандартные порты обсуждаются также здесь: http://www.pcports.ru, Com-Lpt-Win32.

Сопряжение COM-порт


Контакты COM-порта и их типичные обозначения ниже:


Первый контакт, DCD, передает сигнал начала передачи данных. Он необязателен, но в условиях с большим количеством помех бывает весьма полезен. Следующий RXD контакт, принимающий данные. Это один из трех необходимых сигналов. Третий TXD контакт служит для передачи данных. DTR, DSR, RTS и CTS предназначены только для проверки и подтверждения отправки-получения данных. Обычно классический нульмодем не превышает длины в полтора метра, а при такой длине шнура трудно навести какие-либо помехи. Девятый RI - сигнал начала связи, который сохранился как историческая реликвия и практически никогда не использовался, даже в дремучие времена DOS. И наконец, пятый GND - «земля».

1 DCD<- Carrier Detect
2 RXD<- Receive Data
3 TXD-> Transmit Data
4 DTR-> Data Terminal Ready
5 GND== System Ground
6 DSR<- Data Set Ready
7 RTS-> Request to Send
8 CTS<- Clear to Send
9 RI<- Ring Indicator


Мышью используются следующие контакты разъема: RXD (2) - для передачи данных, GND (5) - земля, DTR, RTS (4, 7) – положительное питание, TXD (3) - отрицательное питание. В ряде случаев информационный сигнал подают на ножку 1 (DCD), мышь, как видно, его не использует (но не модем!). Выходной сигнал можно подавать не только на DCD но и на другие контакты CTS, DSR. Детальнее статья. Использование Com-порта в Linux.

В Delphi порт и RTS (7, питание) инициализируется командами:



Иногда RTS-сигнал используется для управления загрузчиком Aurdino-контроллера, выход в нормальный режим работы обеспечивается по reset после установки параметров связи:



Противоположная операция, перехват события (состояния), чтение:



Установка события означает что состояние линии изменилось на противоположное, например с 0 в 1. Изменения на DCD (1 вывода Com-порта) отлавливаются при помощи события EV_RLSD. Разумеется после окончания работы порт надо закрыть функцией CloseHandle(port); end.

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


Исходное состояние линии последовательной передачи данных - уровень логической 1. Это состояние линии называют отмеченным - MARK. Когда начинается передача данных, уровень линии переходит в 0. Это состояние линии называют пустым - SPACE. Если линия находится в таком состоянии больше определенного времени, считается, что линия перешла в состояние разрыва связи - BREAK. Стартовый бит START сигнализирует о начале передачи данных. Далее передаются биты данных, вначале младшие, затем старшие.

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

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

Скорость передачи данных обычно измеряется в бодах (по фамилии французского изобретателя телеграфного аппарата Emile Baudot - Э. Бодо). Боды определяют количество передаваемых битов в секунду. При этом учитываются и старт/стопные биты, а также бит четности. Иногда используется другой термин - биты в секунду (bps). Здесь имеется в виду эффективная скорость передачи данных, без учета служебных битов. Чтение данных из порта возможно после установки параметров связи:



Если приемник качает информацию по DCD, нужен таймер, который будет считать время между изменениями DCD и установкой событий. Промежуток Т между 2 событиями равен нулевому биту в команде или адресе, 2Т соответственно равен 1. Время Т таймера обычно равно промежутку между старт битом и битом синхронизации. Набивая полученными битами байт - получаем искомое число - команду переданную с пульта, вначале идут несколько бит адреса блока команд и только потом сама команда. Плюс нужна поправка на пропуск в цикле каждого второго события, который сигнализирует о том, что сигнал на DCD вернулся в исходное состояние. В принципе по нему можно перезапускать таймер.

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

Связь с телефоном. Кабель содержит адаптор согласования напряжений, они разные у компьютера и телефона (UART). По связи можно отдавать терминальные команды на телефон, статья.

Сопряжение USB-порт


Сигналы USB передаются по 4-х проводному кабелю

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


Номер контактаНазначениеЦвет провода
1V BUSКрасный
2D-Белый
3D+Зеленый
4GNDЧерный
ОплеткаЭкранОплетка


Здесь GND - цепь "корпуса" для питания периферийных устройств, VBus - +5V также для цепей питания. Шина D+ предназначена для передачи данных по шине, а шина D- для приема данных. Кабель для поддержки полной скорости шины (full-speed) выполняется как витая пара, защищается экраном и может также использоваться для работы в режиме минимальной скорости (low-speed). Кабель для работы только на минимальной скорости (например, для подключения мыши) может быть любым и неэкранированным. Разъемы, используемые для подключения периферийных устройств, показаны на рисунке выше.

Возможен доступ с помощью конвертора FT232BM. Это английская микросхема, которая имеет вход UART (или параллельный, аналог LPT, если это FT245BM) и выход USB. Также она имеет драйвер, распространяемый бесплатно. Установив этот драйвер на ПК, вы можете подключить ваше устройство к любому USB порту вашего ПК. При этом, как только ОС обнаружит устройство, USB таинственным образом исчезает из списка портов, а вместо него появляется "виртуальный" порт COMn, где n - номер, как правило, следующий за последним из реальных СОМ портов. См. приложения, включая интерфейс USB-АЦП.

Возможности USB следуют из ее технических характеристик:

Высокая скорость обмена (full-speed signaling bit rate) - 12 Mb/s
Максимальная длина кабеля для высокой скорости обмена - 5 m
Низкая скорость обмена (low-speed signaling bit rate) - 1.5 Mb/s
Максимальная длина кабеля для низкой скорости обмена - 3 m
Максимальное количество подключенных устройств (включая размножители) - 127
Возможно подключение устройств с различными скоростями обмена
Нет дополнительных элементов, таких как терминаторы для SCSI
Напряжение питания для периферийных устройств - 5 V
Максимальный ток потребления на одно устройство - 500 mA

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

Шина USB (Universal Serial Bus - универсальная последовательная шина) появилась по компьютерным меркам довольно давно - версия первого утвержденного варианта стандарта появилась 15 января 1996 года. Разработка стандарта была инициировна весьма авторитетными фирмами - Intel, DEC, IBM, NEC, Northen Telecom и Compaq.

Основная цель стандарта, поставленная перед его разработчиками - создать реальную возможность пользователям работать в режиме Plug&Play с периферийными устройствами. Это означает, что должно быть предусмотрено подключение устройства к работающему компьютеру, автоматическое распознавание его немедленно после подключения и последующей установки соответствующих драйверов. Кроме этого, желательно питание маломощных устройств подавать с самой шины. Скорость шины должна быть достаточной для подавляющего большинства периферийных устройств. Попутно решается историческая проблема нехватки ресурсов на внутренних шинах IBM PC совместимого компьютера - контроллер USB занимает только одно прерывание независимо от количества подключенных к шине устройств.

Сопряжение с COM (USB) на базе процессора ATtiny2313


Rambler's Top100