« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
    Популярное
Секреты Delphi. Использование TClientDataset в двухуровневых приложениях. Часть 3

Создание элементов сайтов с использованием Flash

Функция ShowCursor

Apache + Perl + PHP4 + MySQL для Windows 95/98: руководство по установке

Функция CreateRectRgn

Описание функций C (Си) / C++ - alloca

Функция CountClipBoardFormats

Добавляем компонент в стандартный Message dialog.

Функция AccessResource

Комплексные числа в .NET




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 124
Пользователей: 0

Статьи:: Assembler :: Работа с последовательными портами на IBM PC



отправить ссылку другу версия для печати  Обсудить на форуме

Работа с последовательными портами на IBM PC



Несмотря на то, что существует масса программного обеспечения для включения ПК в сеть с помощью последовательного порта, разработки этого направления не прекращаются. Это обусловлено широким спектром комуникационных задач: связь ПК с регистрационной аппаратурой, с мини и большимим ЭВМ (MainFrame), подключение ПК к телефонной сети и др. Подробно об этом и вкратце о последовательных портах можно прочитать в журнале МИР ПК N3, 89. В этой статье будут рассматриваться проблемы программирования при работе с последовательными портами.

Вообще, те программисты, которые имеют возможность приобрести за 299 долларов великолепную библиотеку Comm Library фирмы Greenleaf Software могут не читать эту статью, поскольку эта библиотека содержит широкий набор функций позволяющих программистам работающим на языке Си создавать программы работающие с последовательными портами без особых проблем. Но так как в СССР таких программистов немного (автор неприемлет использование программного обеспечения, добытого несовсем законным путем), была написана эта статья.

IBM PC может содержать до четырех последовательных портов, также называемых адаптерами RS-232C. В PS/2 (кроме моделей 25 и 30) может быть до восьми таких адаптеров. В MS-DOS последовательные порты называются COMX , где X - номер порта. Работать с последовательными портами можно как с использованием BIOS (Basic Input-Output System), так и непосредственно через использование аппаратных прерываний.

В BIOS для работы с последовательными портами выделено специальное прерывание int14 (Здесь и далее числа даны в 16-ричной системе счисления). С помощью этого прерывания можно установить параметры порта, проверить статус порта, принять или передать байт данных. Но при работе через BIOS программа должна обрабатывать данные со скоростью не меньшей чем скорость их поступления, т.к. в IBM PC не поддерживается аппаратная буферизация данных проходящих через последовательный порт. Работа с использованием int14 возможна при передаче данных со скоростями до 300 бод. При больших скоростях неизбежна потеря данных.

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

В конце статьи приведена простейшая программа эмулятор терминала и в процессе ее разбора объясняются основные принципы программирования адаптера RS-232C.

Посмотрим на текст программы. В файле TERM.C содержится программа эмулятор терминала. Как видите, программа в начале анализирует аргументы командной строки. Анализ примитивный из за экономии места и Вы вправе написать его в своем стиле. В случае отсутствия ошибок вызывается функция portbase для определения базового адреса порта. Что это такое?

Дело в том, что к каждому из адаптеров относятся 8 специальных управляющих и контрольных регистров выполняющих одну или несколько функций в зависимости от режима работы RS-232C. Эти регистры располагаются один за другим начиная с базового адреса. Этот адрес содержится в специальной области данных базовой системы ввода-вывода (BIOS Data Area). Базовые адреса имеют формат слова и располагаются один за другим начиная с адреса 40:0. Если порт отсутствует,то в BIOS Data Area содержится 0.

Обычно COM1 имеет базовый адрес 3F8, COM2 - 2F8. Не спрашивайте меня почему COM1 имеет больший базовый адрес, я всего лишь программист. В дальнейшем, в пояснениях, мы будем использовать адресацию регистров соответствующую порту COM1, т.е. от 3F8 до 3FF.

Вернемся к головной функции. После определения базового адреса порта вызывается функция setparm, которая устанавливает параметры обмена: скорость, тип контроля по четности, число информационных битов и число стоповых битов. Как это делается?

Параметры линии, кроме скорости, устанавливаются в регистре, который называется регистром управления линией - LCR (Line Control Register). Этот регистр имеет адрес 3FB.

Скорость передачи устанавливается отдельно от остальных параметров. Для этого в регистре 3FB нужно установить бит 7 в 1 (В литературе по IBM PC принято нумеровать биты с права налево и самый правый бит имеет номер 0). Этот бит называется битом загрузки делителя (Divisor Latch Access Bit). DLAB управляет режимом регистров 3F8 и 3F9. Если в регистре 3FB бит 7 выставлен в 1 то эти регистры становятся регистрами в которые записывается или может считываться соответсвенно младший байт и старший байт делителя скорости обмена. Дело в том, что адаптер RS-232C имеет задающий генератор частоты 1.8432 МГц. Эта частота делится на 16 и на 16ти битовое число-делитель частоты, которое извлекается из регистров 3F8 и 3F9. Таким образом получается частота с которой передаются и принимаются данные. Делитель для любой требуемой скорости можно получить по формуле:

Как видно из формулы, скорость обмена не может превышать 115200 бод. Остальные параметры устанавливаются непосредственно в регистре 3FB. (Бит 6 этого регистра служит для посылки сигнала разрыва связи. При установлении этого бита в 1 порт начинает посылать в линию двоичные нули до тех пор пока эторт бит не будет установлен в 0. Мы этот режим рассматривать не будем.) После установки параметров бит 7 нужно установить в 0, что переводит порт в рабочий режим. При этом регистр 3F8 становится буфером в который кладется байт для передачи или из которого берется принятый байт.

После установки параметров вызывается функция porton, которая подготавливает порт непосредственно к работе. В начале эта функция определяет уровень аппаратного прерывания IRQ (Interrupt ReQuest) которое будет вызывать порт. В IBM PC XT/AT,как правило,порты COM1 и COM3 вызывают прерывание IRQ 4, а COM2 и COM4 - IRQ 3. В PS/2 все порты с COM2 до COM8 вызывают прерывание IRQ 3. Аппаратные прерывания IRQ 4 обслуживаются обработчиком прерывания с вектором 0C, а IRQ 3 с вектором 0B. Существует способ определить программным путем номер прерывания вызываемого конкретным портом, но мы в целях экономии места его не приводим т.к. его применение имеет смысл при наличии в ПК более чем 2 портов, что в СССР редкость. Интересующихся отсылаем к исходным текстам известного пакета MS Kermit 2.32, файл MSXIBM.ASM.

После определения номера прерывания функция подменяет обработчик прерывания на свой - функция i_handler. Эта функция является обработчиком прерывания и вызывается непосредственно операционной системой, но не из других функций. Она получает управление при возникновении прерывания от последовательного порта, в нашем случае при приеме байта. Принятый байт помещается в буфер определенный в программе как массив символов buf.

Помимо буфера для хранения принятых данных, в программе определены два указателя: inptr и outptr. Первый из них указывает на первое свободное место в буфере, а второй - на первый считываемый байт. Буфер кольцевой, указатель inptr inptr inptr увеличивается на единицу если буфер не заполнен до конца или устанавливается в начало буфера в противном случае.

После выборки байта из порта и помещения его в программный буфер в регистр управления прерываниями контролера 8259A посылается сигнал об окончании обработки прерывания и обработка прерывания заканчивается. Контроллер 8259A и работа с ним описана чуть ниже. После замены обработчика прерывания выставляются сигналы: Запрос на

передачу - RTS (Request To Send), Терминал готов - DTR (Data Terminal Ready) и сигнал Выход 2 - OUT2. Эти сигналы выставляются установкой в 1 соответсвующих битов в регистре управления модемом - MCR (Modem Control Register). Этот регистр имеет адрес 3FC.

Бит 3 этого регистра нужно выставить в 1 для того, чтобы разрешить прерывания от схем RS-232. Сигналы RTS и DTR используются как сигналы синхронизации связи. Остальные биты этого регистра мы рассматривать не будем.

Далее мы должны установить требуемый тип прерывания который должен вызываться портом. По условию нашей задачи требуется чтобы преывания возникали по приходу каждого байта. Напомним, что регистр 3F9 может выполнять две функции. Если в регистре 3FB бит 7 выставлен в 0, то регистр 3F9 является регистром разрешения прерываний - IER (Interrupt Enable Register). Если бит 0 этого регистра установлен в 1 то порт будет инициировать прерывания по приходу каждого байта данных. Если бит 1 установлен в 1 то порт будет вызывать прерывания при готовности порта к передаче данных. Бит2 отвечает за генерацию прерываний при ошибках приема данных или при появлении сигнала разрыва связи (BREAK). Бит 3 управляет генерацией прерываний при изменении входного статуса порта. Остальные биты этого регистра всегда должны быть выставлены в 0.

Для того чтобы ПК мог воспринимать прерывания от последовательного порта мы должны также запрограмировать контроллер управления прерываниями 8259A. Этот контроллер имеет два регистра с адресами 20 и 21. В регистр с адресом 20, регистр управления прерываниями - ICR (Interrupt Control Register), посылается сигнал об окончании обработки прерывания. Для прерывания IRQ 3 таким сигналом является число 63, а для IRQ 4 - 64. Также можно использовать общий сигнал - число 20. В регистре 21, который называется регистром маскирования прерываний - IMR (Interrupt Mask Register) , каждый из 8 битов отвечает за соответствующее прерывание IRQ 0-7. Если соответсвующий бит выставлен в 1 прерывание замаскировано, т.е. ПК на него не реагирует.

Этот контроллер управляет не только прерываниями от последовательных портов, но и прерываниями от других устройств включая клавиатуру, дисковые накопители и др. Поэтому при работе с ним нужно соблюдать осторожность. Для того, чтобы ПК воспринимал прерывания от порта COM1 нужно установить в 0 бит 4 регистра маскирования прерываний этого контроллера (см. рис. 4), а для порта COM2 - бит 3.

Вернемся к программе. После функции porton начинает выполняться основной цикл программы. С помощью функции portin выбираются данные из буфера по одному байту и отбражаются на экране. Если пользователь ввел данные с клавиатуры. то они посылаются в линию связи с помощью функции portout. Если нажимается клавиша Esc цикл завершается.

Обратите внимание на то, что функция portin работает не с портом, а с нашим буфером в который данные помещаются автоматически обработчиком прерываний i_handler. Если буфер пустой функция возвращает -1.

Функция portout дожидается пока порт будет готов к передаче и затем передает байт. Готовность порта определяется по состоянию регистра с адресом 3FD который называется регистром статуса линии - LSR (Line Status Register).

Для нас важен бит 5 этого регистра. Если этот бит выставлен в 1, то это значит, что регистр 3F8 пуст и в него можно засылать байт который будет передан в линиию. Обратите внимание на то, что этот регистр не показывает, что предыдущий передаваемый байт уже передан - это показывает бит 6. Готовность порта к перередаче означает только то, что байт предназначеный для передачи уже выбран схемами порта из регистра 3F8 и побитно передается с заданой скоростью и др. параметрами.

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

В заключение коротко поясним назначение регистров 3FA, 3FE и 3FF.

Регистр 3FA называется регистром идентификации прерываний - IIR (Interrupt Identification Register). В случае, когда в регистре 3F9 разрешены несколько типов прерываний, по состоянию регистра 3FA обработчик может определить конкретный тип прерывания.

Регистр 3FE называется регистром статуса модема - MSR (Modem Status Register). Этот регистр показывает наличие или изменение некоторых сигналов линии связи. По остоянию этого регистра можно можно определить например, включен или выключен модем.

Регистр 3FF не несет никакой функциональной нагрузки и может использоваться как буфер для хранения одного байта. Но нужно помнить, что в раннних реализациях RS-232C этот регистр может отсутствовать.
 




Рубрика: Assembler




HTML 5: пять вещей вызывающих особый интер....

Html

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


Подробнее... | Рубрика: Html | Добавлено: 22.12.2008

asp.net: ListView с разных сторон.

.NET компоненты

Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.


Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

Создание кросс-таб отчета в Stimulsoft Rep....

.NET компоненты

Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.


Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

Остальные статьи:

VivaMP - инструмент для OpenMP
Создаем контекстно-зависимое WPF-приложени...
Windows Vista SP2: что внутри и что важно?
Вышел MySQL 5.1.30, первый стабильный рели...
Тестирование параллельных программ
Архитектура AMD64 (EM64T)
Платформа 2009. Определяя будущее
Windows Vista Bridge Sample Library - упра...
Оптимизация 64-битных программ
Подгрузка через AJAX HTML-кода, содержащег...
Обзор нового релиза самой мощной Ajax библ...
Firebug 1.3 и 1.4 alpha — что нового и инт...
Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

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

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия