Уголок связиста Четверг, 04 Июн 2020, 20:39
Приветствую Вас гость | RSS
Новые сообщения
  • Вопрос по для С... (0)
    13 Окт 2015 [borisenko2077]
  • Группы пользова... (4)
    10 Янв 2014 [Кикманэ]
  • GPRS (1)
    17 Июл 2013 [Кикманэ]
  • Для вновь прише... (5)
    05 Окт 2012 [Alex]
  • снятие "ул... (0)
    21 Май 2012 [stepakov]
  • Список дополнен... (0)
    20 Май 2012 [Alex]
  • Игра - "Я ... (19)
    01 Дек 2009 [vicksol]
  • Игра "АССО... (199)
    01 Ноя 2009 [vicksol]
  • Мобильник все-т... (4)
    28 Май 2009 [Alex]
  • Nod32 (2)
    28 Май 2009 [Alex]

  • Меню сайта

    Топ-пользоватлей
    1. Alex (388 - 53 - 70)
    2. natapin (62 - 0 - 0)
    3. vicksol (50 - 0 - 0)
    4. misterX (24 - 0 - 0)
    5. Olga (21 - 0 - 0)
    6. Lizard (18 - 0 - 0)
    7. genaha (11 - 0 - 0)
    8. Кикманэ (3 - 0 - 0)
    9. 345678 (2 - 0 - 0)
    10. megaeregi (1 - 0 - 0)

    Сегодня:

    Друзья сайта

    Форма входа

    Статистика

    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]


    • Страница 1 из 1
    • 1
    Наш форум » Уголок связиста » Статьи » COM-порт
    COM-порт
    AlexДата: Понедельник, 15 Дек 2008, 16:59 | Сообщение # 1
    Главный админ
    Группа: Администраторы
    Город:
    Сообщений: 388
    Статус: отсутствует
    На самой первой персоналке COM-порт уже был, поэтому он может похвастаться как минимум двадцатилетней историей. Хорошо это или плохо? С точки зрения скорости работы наверное плохо, поскольку это старый стандарт, и скорость передачи данных по нему не может превышать 115200 бит в секунду, что, согласись, по сегодняшним временам очень и очень мало. Допустим, если с такой скоростью копировать фильм в формате DivX, то процесс будет завершен всего-то за 16 часов. Однако есть и другая точка зрения: поскольку это старый стандарт, то в реализации найдены и исправлены практически все ошибки, по стандарту написано множество документации и имеется огромное количество программного кода, использующего этот стандарт. Стандарт широко распространен - сегодня невозможно найти персональный компьютер без COM-порта, а значит устройство, подключаемое к нему, может быть использовано в любой точке планеты. Кроме того производители железа активно используют COM-порт для вспомогательных целей (например, для подключения ИК-приемника пульта ДУ), да и свое самодельное устройство легче всего подключить именно к COM-порту.

     
    AlexДата: Понедельник, 15 Дек 2008, 17:01 | Сообщение # 2
    Главный админ
    Группа: Администраторы
    Город:
    Сообщений: 388
    Статус: отсутствует
    Мышь и COM-порт

    Несмотря на то, что COM-порт изначально был разработан для подключения модема, впоследствии был придуман способ использовать его для самых разнообразных устройств. Одной из первых стала мышь. Взаимодействие COM-порта и мыши происходит, по сравнению с модемом, достаточно просто, ведь мышь только передает данные и ничего взамен не принимает, ну, кроме питания, конечно. Единственное, что еще нужно мыши, так это прерывание, для того чтобы сигнализировать о ее движениях. Информация о событиях мыши – перемещение, нажатие кнопок - кодируется и пересылается по интерфейсу. Мышью используются следующие контакты разъема:

    * RD (2) – для передачи данных;
    * SG (5) – земля;
    * DTR, RTS (4, 7) – положительное питание;
    * TD (3) – отрицательное питание.

    Существует две разновидности мышей, подключаемых к COM-порту – MS Mouse и PC Mouse. Каждая из этих мышей должна использовать свой драйвер, поскольку они, хотя и работают на одной скорости – 1200 бит/сек, используют один стоповый бит и не используют контроль четности, но имеют различный формат передаваемых данных. MS Mouse передает с каждым пакетом по 7 бит информации, а PC Mouse – 8. Кроме того, состояние MS Mouse описывается тремя байтами, а PC Mouse – пятью.

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

    Программирование COM-порта
    Каждый COM-порт однозначно ассоциируется с двумя параметрами – базовым адресом порта и номером прерывания. В BIOS’е ты можешь выбрать, какие именно значения соответствуют каждому порту. По умолчанию там указаны следующие значения для портов: COM1 - 3F8-IRQ4, COM2 - 2F8-IRQ3. Управляется порт семью регистрами, с адресами ввода/вывода начиная с 3F8 по 3FE (для COM1) или с 2F8 по 2FE (для СОМ2) – это в том случае, если ты используешь базовый адрес порта по умолчанию. Для программирования COM-порта нужно записывать или считывать значения в порты по этим адресам. Начнем по порядку.

    Назначение регистров
    Итак, регистр данных - ему соответствует адрес порта ввода/вывода 3F8. Записывая в этот порт данные, ты сообщаешь передатчику байт, который необходимо послать. Передатчик сохраняет этот байт в своем буфере данных (регистре) и в дальнейшем передает его приемнику по интерфейсу. В случае приема данных этот же регистр используется для чтения приятого байта. Тем не менее, передача данных - не единственное назначение этого регистра. Если в регистре управления портом (3FB) седьмой бит выставлен в единицу, то регистр 3F8 выдает тебе младший байт делителя частоты тактового генератора, старший байт в этом случае выводится в регистре 3F9. Получившееся слово характеризует скорость работы COM-порта.

    Регистр управления прерываниями (3F9) разрешает (бит равен 1), или запрещает (бит равен 0) следующие прерывания:

    * бит 0 – готовность принимаемых данных;
    * бит 1 – готовность переданных данных (когда записанный в регистр данных байт, целиком передан);
    * бит 2 – состояние разрыва соединения или обнаружения ошибки;
    * бит 3 – изменения на разъеме COM-порта.

    Регистр идентификации прерывания (3FA) определяет причину появления прерывания. Бит ноль, если он равен единице, сигнализирует об отсутствии прерываний, ожидающих обслуживание. В битах 1-2 зашифрованы следующие состояния:

    * 00 – прерывание генерируется при переполнении приемника, ошибке четности или формата данных, или при состоянии разрыв соединения, сбрасывается при чтении регистра состояния линии;
    * 01 – данные приняты и доступны для чтения, сбрасывается после чтения из порта данных;
    * 11 – устанавливается при изменении состояния входных линий CTS, RI, DCD и DSR.

    Биты 3-7 должны быть равны нулю.

    Регистр управления портом (3FB), с его помощью можно задать различные параметры порта, такие как, например, размер передаваемого пакета данных, количество стоповых битов, тип контроля четности и т.д. Полный список, приведен в следующей таблице.

    Регистр управления устройством модуляции-демодуляции или просто модемом (3FC) - достаточно специфический регистр, который управляет состоянием линий DTR (бит 0) и RTS (бит 1), состоянием модемных резервных линий OUT1 (бит 2), OUT2 (бит 3) и запуском автодиагностики порта при замыкании выхода на вход (бит 4). Биты с пятого по седьмой должны быть равны нулю. Выставление соответствующего бита в 1 приводит к появлению на линии логической единицы, запуск автодиагностики происходит также при выставлении четвертого бита в единицу.

    Регистр состояния линии (3FD) является самым полезным регистром после регистра данных. С его помощью ты всегда сможешь узнать, в каком состоянии у тебя находится порт, и можно ли тебе произвести нужное действие. Вот формат этого регистра (1 соответствует активному состоянию):

    * бит 0 – приемник получил данные, и их можно прочитать из регистра данных, при чтении из регистра 3F8 этот бит устанавливается в 0;
    * бит 1 - потеря данных, новый байт данных был получен, а старый не прочитан из регистра данных, и новый байт заместил в регистре данных старый байт;
    * бит 2 – произошла ошибка четности;
    * бит 3 – произошла ошибка синхронизации;
    * бит 4 – обнаружен разрыв соединения;
    * бит 5 – регистр переданных данных пуст, можно записать новый байт;
    * бит 6 – данные переданы приемнику (то есть сдвиговый регистр, куда помещается байт из регистра данных, пуст);
    * бит 7 – устройству не удалось связаться с компьютером в установленный срок.

    И, наконец, последний из регистров COM-порта, регистр состояния модема (3FE), имеет следующий формат:

    * бит 0 – произошло изменение состояния линии CTS;
    * бит 1 – произошло изменение состояния линии DSR;
    * бит 2 – произошло изменение состояния линии IR;
    * бит 3 – произошло изменение состояния линии DCD;
    * бит 4 – состояние линии CTS;
    * бит 5 – состояние линии DSR;
    * бит 6 – состояние линии IR;
    * бит 7 – состояние линии DCD;

    Алгоритм работы
    Допустим, ты спаял некое устройство, подключаемое к COM-порту. Этот супердевайс принимает от компьютера управляющие команды и отсылает ему какую-нибудь информацию. Тогда твоя программа будет выглядеть следующим образом:

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

    Один поток твоей программы постоянно занят тем, что отправляет данные, поступающие ему на вход, в регистр данных. Но отправляет он их только тогда, когда регистр данных готов к этому, то есть тебе надо постоянно проверять пятый бит регистра состояния порта 3FD, и если он становится равным единице, то можно писать байт в регистр данных 3F8.

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

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

    Наконец последнее, о чем я хочу тебя предупредить, это различия в работе операционных систем с ядром NT (Windows NT, 2000, XP, AS2003) и старых Windows 9Х/Me. Если в старых ОС можно было напрямую работать с портами, например с помощью методов стандартной библиотеки C - _inp(), _outp(), которые, в свою очередь, просто выполняют ассемблерные команды in, out, то в новых системах тебе придется изрядно попотеть. По словам Microsoft, для целостности системы больше кого попало к портам ввода/вывода не пускают, и если ты хочешь что-нибудь прочитать или записать из/в порт, будь любезен, работай на уровне драйвера устройства, то есть пиши свой драйвер, дружок.


     
    Наш форум » Уголок связиста » Статьи » COM-порт
    • Страница 1 из 1
    • 1
    Поиск:
    FreeTechnologyCorp © 2020Конструктор сайтов - uCoz