close

Вход

Забыли?

вход по аккаунту

?

Lab 1 1(1)

код для вставкиСкачать
1 ЛАБОРАТОРНАЯ РАБОТА № 1. РАЗРАБОТКА КОМПОНЕНТ КОММУНИКАЦИОННОГО ПО НИЖНЕГО УРОВНЯ (НА ПРИМЕРЕ АДАПТЕРА ПОСЛЕДОВАТЕЛЬНОГО КАНАЛА). ИССЛЕДОВАНИЕ ПРОТОКОЛА MODBUS
1.1 Цель работы
Целью работы является практическое изучение архитектуры адаптера последовательного канала персонального компьютера, получение навыков работы с COM-портом ПК и исследование протокола обмена данными Modbus.
1.2 Задачи работы
Задачами работы являются:
* изучение принципов работы старт-стопной синхронизации;
* изучение принципов работы интерфейса RS-232C;
* изучение протокола обмена данными Modbus и его программной реализации поверх RS-232C для связи устройств Master-Slave.
1.3 Задания на лабораторную работу
1. Ознакомиться с основными программно - доступными элементами адаптера асинхронной связи на базе ИМС i8250/16550A.
2. Изучить особенности программирования адаптера асинхронной связи для работы в различных режимах.
3. Отладить и протестировать программы, реализующие алгоритмы, заданные преподавателем.
1.4 Краткие теоретические сведения об последовательностных интерфейсах
Среди достаточно распространенных способов реализации последовательной связи в вычислительной технике выделяется использование коммуникационного порта на базе специальных микросхем, которые обеспечивают обмен данными между различными устройствами в последовательном коде по асинхронному методу. Это оборудование удовлетворяет требованиям стандарта США RS-232C и рекомендациям V.24 и V.28 международного консультативного комитета по телефонии и телеграфии МККТТ (CCITT). Этим стандартам соответствуют ГОСТ 18145-81 и ГОСТ 23675-79, соответственно.
В нижеследующем изложении будем называть такое оборудование наиболее распространенными терминами - "интерфейс RS-232C", или "последовательный асинхронный интерфейс".
Последовательный интерфейс RS232 - это промышленный стандарт для последовательной двунаправленной асинхронной передачи данных. RS-232 - интерфейс передачи информации между двумя устройствами на расстоянии до 15 метров. Информация передается по проводам с уровнями сигналов, отличающимися от стандартных 5 В, для обеспечения большей устойчивости к помехам. Асинхронная передача данных осуществляется с установленной скоростью при синхронизации уровнем сигнала стартового импульса.
Стандартные физические порты, используемые промышленными сетями: RS-232, RS-422, RS-485. Подавляющее большинство сетей использует наиболее мощный по числу узлов на сети и наиболее скоростной по передаче данных порт RS-485. RS-232 также достаточно широко используется в промышленных средствах автоматизации. Он обеспечивает соединение "точка к точке" между последовательным портом контроллера и приборами. Часто, за счет усовершенствования передатчика и кабеля, достигается большие длина линии и скорость, чем зафиксировано в стандарте.
Интерфейс RS-232C обеспечивает следующие возможности:
1) применение ПК в качестве абонентского пункта в системах и сетях телеобработки данных, в частности, реализуемых на базе интеллектуальных программируемых микроконтроллеров. Часто в подобных случаях ПК подключается через этот интерфейс к устройствам преобразования сигналов (модемам), которые в свою очередь подключаются к каналам связи;
2) подключение к ПК различных устройств ввода-вывода (принтеров, графопостроителей, графических манипуляторов, внешних НГМД, стримеров и т.д.);
3) объединение нескольких PC между собой и с другими ЭВМ для организации перекачки файлов между ними.
Популярность интерфейса RS-232C объясняется его универсальностью в части диапазона скоростей передачи информации (от 50 до 115000 бит в секунду), "прозрачностью", т.е. отсутствием запрещенных к передаче кодовых комбинаций, наличием специализированных БИС и ИС, на которых достаточно эффективно реализуется данный интерфейс, простотой конструкции соединительных кабелей.
Микросхемы, на основе которых строится интерфейс RS-232C, обычно называют универсальными асинхронными приемниками - передатчиками (universal asynchronous receiver transmitter или UART). Рис. 1. Интерфейс RS-232
1.4.1 Основные свойства COM портов
Работа коммуникационных портов реализована на универсальных асинхронных приемопередатчиках UART. UART - это микросхемы, которые работают по стандарту RS-232C. Для СОМ порта компьютера используется 9-ти штырьковый разъем DE9p. В этом разъеме используется шесть сервисных сигналов и два канала обмена последовательными данными. Интерфейс между терминалом (DTE) и модемом (DCE) по передаче последовательных данных. Устройства для связи по последовательному каналу соединяются кабелями с девятью или двадцатьюпятью контактными разъемами типа DE-9, DB-25, CANNON 9, CANNON 25 и т.д.
Рис. Нумерация контактов для разъёмов COM-порта
КонтактОбозначениеНаправлениеОписание1SHIELD...Shield Ground - защитная земля, соединяется с
корпусом устройства и экраном кабеля2TXD->Transmit Data - выход передатчика3RXD<--Receive Data - вход приемника4RTS->Request to Send - выход запроса передачи данных5CTS<--Clear to Send - вход разрешения терминалу пере-
давать данныебDSR<--Data Set Ready - вход сигнала готовности от аппаратуры передачи данных7GND...System Ground - сигнальная (схемная) земля8CD<--Carrier Detect - вход сигнала обнаружения несу-
щей удаленного модема9-19N/C--20DTR->Data Terminal Ready - выход сигнала готовности
терминала к обмену данными21N/C--22RI<--Ring Indicator - вход индикатора вызова (звонка)23-25N/C-- КонтактОбозначениеНаправлениеОписание1CD<-Carrier Detect2RXD<-Receive Data3TXDTransmit Data4DTRData Terminal Ready5GND-System Ground6DSR<-Data Set Ready7RTSRequest to Send8CTS<-Clear to Send9RI<-Ring Indicator В IBM PC традиционно используются микросхемы приемо-передатчиков, программно совместимые с UART 8250 фирмы Intel (или с дальнейшим их развитием - микросхемами 16550 и 16550A).
Строго говоря, УАПП реализуются в виде целого ряда БИС различных конструкций и компоновки. Эти БИС могут располагаться как на базовой плате ПК, так и входить в различных комбинациях в адаптеры интерфейсов. Существуют БИС, реализующие два интерфейса RS-232C и стык Centronics. Возможны и другие варианты реализации оборудования RS-232C, но структура УАПП (назначение, адресация и логические связи входящих в их состав регистров) унифицирована и не зависит от конкретной реализации БИС. Что касается основных различий между микросхемами серий 8250 и 16550A, то сводятся они к наличию в последних регистра расширения, буферных массивов типа FIFO (First In First Out - первым вошёл, первым вышел, т.е. очередь) и возможности использования нескольких каналов прямого доступа. Использование FIFO позволяет уменьшить частоту прерываний центрального процессора компьютера при большой скорости обмена по последовательному каналу. Если скорость обмена превышает 9600 бит/с, желательно использовать эти микросхемы.
Обычно ПК имеют в своем составе два интерфейса RS-232C, которые обозначаются COM1 и COM2. Возможна установка дополнительного оборудования, которое обеспечивает функционирование в составе PC четырех, восьми и шестнадцати интерфейсов RS-232C. Базовые адреса портов коммуникации хранятся в ячейке 0040:0000 для COM1 и 0040:0002 для COM2 (базовый адрес это 2-хбайтовый адрес порта, который является младшим из группы адресов портов, дающих доступ к UART.) На всех машинах (кроме тупиковой ветви развития - PCjr) COM1 имеет базовый адрес 3F8H, а COM2 - 2F8H.
Для удобства, в дальнейшем будем всегда нумеровать регистры выражением вида 3FxH, но все сказанное в равной степени применимо и к регистрам 2FxH. Микросхема 8250 имеет 10 программно-доступных однобайтных регистров, с помощью которых управляется и контролируется порт коммуникации. Большинство из них имеют отношение к инициализации порта, процессу, который может быть достаточно сложным. Обращение к этим 10 регистрам осуществляется через семь адресов портов с номерами 3F8H - 3FEH (или 2F8H - 2FEH). Для адресации регистров УАПП предусмотрено только три адресных разряда, поэтому адресация некоторых регистров ввода/вывода обеспечивается дополнительными средствами.
Конкретно, в пяти случаях регистр, к которому получается доступ через данный порт, определяется тем, как установлен бит 7 в регистре контроля линии, который является единственным регистром с адресом порта 3FBH. Эти регистры приведены ниже.
3F8H (OUT, бит 7 = 0 в 3FBH) Регистр хранения передатчика
3F8H (IN, бит 7 = 0 в 3FBH) Регистр данных приемника
3F8H (OUT, бит 7 = 1 в 3FBH) Делитель скорости обмена (младший)
3F9H (IN, бит 7 = 1 в 3FBH) Делитель скорости обмена (старший)
3F9H (OUT, бит 7 = 0 в 3FBH) Регистр разрешения прерывания
3FAH (IN) Регистр идентификации прерывания
3FBH (OUT) Регистр управления линии
3FCH (OUT) Регистр управления модемом
3FDH (IN) Регистр статуса линии
3FEH (IN) Регистр статуса модема
Из десяти регистров лишь шесть необходимы для организации простой последовательной связи. Регистр хранения передатчика содержит байт данных, которые будут отправлены, а регистр данных приемника - последний полученный байт данных. Регистры управления и статуса линии инициализируют и управляют линией связи, величина скорости обмена при этом задается значением, содержащимся в двух регистрах делителя скорости обмена. Из оставшихся четырех регистров регистры управления и статуса модема используются только для связи через модем, а два регистра, связанные с прерываниями используются только в процедурах, активизируемых по прерываниям. Прерывания используются при связи в целях эффективности. Обычная коммуникационная процедура для определения готовности устройства к обмену непрерывно проверяет регистр статуса линии, ожидая вводимого символа или указания, что все готово для передачи следующего байта данных. Поскольку скорости, на которых работает процессор намного выше, чем обычные скорости с которыми передаются последовательные данные, то этот метод напрасно расходует процессорное время, которое может использоваться для обработки поступающих или передаваемых данных. По этой причине микросхема 8250 может быть установлена в режим, вызывающий прерывание при появлении символа, возникновении ошибки и т.п. Это прерывание может моментально вызвать процедуру Вашей программы, которая, например, будет передавать следующий символ из коммуникационного буфера.
1.4.2 Уровни сигналов UART
UART использует уровни сигналов -12 в....+12 в. Зоной нечувствительности - отсутствие сигналов - считается напряжение -3 в...+3 в. При этом принимаемые/передаваемые данные инвертированы. Рис. Уровни сигналов UART по стандарту RS-232c
Исходные состояния * порт не инициализирован - на всех линиях напряжения находятся в диапазоне -3в...+3в * режим ожидания - на всех линиях напряжение находится в диапазоне -3в...-12в 1.4.3 Передача данных через UART
При передаче данных символы передаются из буфера передатчика последовательно (первым пришел - первым вышел). На рис. 2 показан вид сигнала на информационной линии интерфейса RS-232C. Логической единице соответствует напряжение -12 В, а логическому нулю - +12 В.
За последним битом данных символа может следовать бит паритета, служащий для обнаружения ошибки передачи битов данных. Последним передается стоповый бит, который необходим для временного разделения переданных символов Рис. Передача символов "0" "0" без паритета, с одним стоповым битом
Стоповый бит разделяет два переданных символа. При необходимости можно увеличить этот интервал до 2 стоповых битов, если конечное устройство не успевает разделять символы. Рис. Передача символов "0" "0" с проверкой на четность (EVEN), с одним стоповым битом
Рис. 2. Сигнал на информационной линии интерфейса RS-232C
Форма сигнала, передаваемого в информационную линию, представлена на рис. 3.
Рис. 3. Отображаемый информационный сигнал
В приведенном на рисунке примере через интерфейс передается число "01010101", соответствующее кодировке символа "U". Следует обращать внимание, что последовательность старших и младших бит при дальнейших преобразованиях должна быть соблюдена: "Бит 7"-"Бит 6"-"Бит 5"-"Бит 4"- "Бит 3"-"Бит 2"-"Бит 1"-"Бит 0".
Частота передачи информации по интерфейсу определяется следующей формулой:
,(1)где - несущая частота интерфейса, Гц; - время передачи одного двоичного разряда, с.
(см. рис. 2) - время передачи байта информации. Количество стоповых бит может быть увеличено пользователем ПК до 2. Стартовый бит единственен. На основании полученной эпюры напряжения можно определить логическую последовательность передаваемых информационных разрядов:
[0(01001110)1][0(10100110)1][0(00110110)1][0(10000110)1][0(10011110)1],
где [стартовый(младший...старший)стоповый] биты.
В дальнейшем принятую последовательность необходимо преобразовать в кодировку ASCII. Результатом проделанных действий является выделенное слово "relay".
Следует учитывать, что передача начинается с младших бит, а заканчивается старшим битом!
1.4.4 Соединительные кабели
Нуль-модемное соединение двух COM портов.
При таком соединении терминалы соединяются между собой непосредственно через СОМ-порты. Так как компьютеры обладают большой скоростью обработки данных, то синхронизировать их работу не нужно. Предполагается, что режим синхронизации обмена (Handshaking): 0-None, то есть сервисные сигналы не влияют на процедуры обмена данными. Для этого используется нуль-модемный кабель. Рис. Нуль-модемный кабель для Handshaking = 0 (None)
Так как режим синхронизации обмена на СОМ портах может быть включен, то часто сервисные сигналы СОМ портов замыкают самих на себя, тем самым исключая их влияния на процедуру обмена. Рис. Нуль-модемный кабель для любых режимов Handshaking
Можно использовать полный кабель, но при этом СОМ-порты должны быть настроены на аппаратную синхронизацию обмена. Данный режим используется, когда устройство не успевает перерабатывать информацию, полученную по СОМ-порту. Этот режим позволяет останавливать обмен данных на время обработки полученной информации. Рис. Нуль-модемный кабель для аппаратного режима синхронизации Handshaking=2
1.5 Программирование последовательного порта.
1.5.1 Инициализация последовательного порта
При проведении инициализации порта коммуникации ("открытии") устанавливаются все характеризующие его режим параметры. Эти параметры включают длину слова, число стоп-битов, установку четности и скорость обмена. Длина слова - это число битов, которое образует основную единицу данных. Помимо варианта, когда обмен ведется привычными порциями по 8 битов, возможно использование 7 битов, что достаточно для стандартных файлов ASCII (в которых все символы имеют коды, не превышающие ASCII 128), в то время как для передачи численных данных достаточно порций по 4 бита. Вообще, для понимания дальнейшего важно учитывать следующие основные принципы обмена информацией по интерфейсу RS-232C:
1) обмен данными обеспечивается по двум цепям, каждая из которых является для одной из сторон передающей, а для другой приемной;
2) в исходном состоянии по каждой из этих цепей передается двоичная единица, т.е. стоповая посылка. Передача стоповой посылки может выполняться сколько угодно;
3) передаче каждого знака данных предшествует передача стартовой посылки, т.е. передача двоичного нуля в течение времени, равного времени передачи одного бита данных;
4) после передачи стартовой посылки обеспечивается последовательная передача всех разрядов знака данных, начиная с младшего разряда. Количество разрядов знака может быть 5, 6, 7 или 8;
5) после передачи последнего разряда знака данных возможна передача контрольного разряда, который дополняет сумму по модулю 2 переданных разрядов до четности или нечетности. В некоторых системах передача контрольного разряда не выполняется;
6) после передачи контрольного разряда или последнего разряда знака, если формирование контрольного разряда не предусмотрено, обеспечивается передача стоповой посылки. Минимальная длительность посылки может быть равной длительности передачи одного, полутора или двух бит данных.
Обмен данными по описанным выше принципам требует предварительного согласования приемника и передатчика по количеству используемых разрядов в символе, правилам формирования контрольного разряда и длительности передачи бита данных.
Последнее согласование обеспечивается путем стандартизации ряда скоростей: 50, 75, 100, 110, 200, 300, 600, 1200, 2400, 4800, 9600, 19 200, 38 400, 57 000 или 115 000 бит в секунду. Установленная скорость должна отличаться от номинальной не более чем на 2 %, что гарантированно обеспечивается применением генераторов с кварцевыми резонаторами.
С учетом структурной схемы УАПП обычно реализуется следующий алгоритм инициализации:
1) запись в регистр 3FBh управляющего байта с единицей в седьмом разряде;
2) запись константы деления в регистры 3F8h и 3F9h;
3) запись управляющего байта с нулем в седьмом разряде. Назначение остальных разрядов регистра 3FBh указано ниже;
4) запись управляющего байта в регистр 3F9h;
5) запись управляющего байта в регистр 3FCh.
1.5.2 Программирование на среднем уровне (уровне BIOS)
Функция 0 прерывания 14H BIOS инициализирует порт коммуникации. В DX должен даваться номер коммуникационного канала (COM1 = 0, COM2 = 1). В AL должен содержаться байт инициализационных данных, значение битов которого следующее
биты 1-0 длина слова: 10 = 7 битов, 11 = 8 битов.
2 число стоп-битов: 0 = 1, 1 = 2.
4-3 четность: 00 или 10 = нет,
01 = нечет, 11 = чет.
7-5 скорость обмена: 000 = 110 бод
001 = 150 бод
010 = 300 бод
011 = 600 бод
100 = 1200 бод
101 = 2400 бод
110 = 4800 бод
111 = 9600 бод
1.5.3 Программирование на низком уровне
Независимо от того, занимается программа вводом или выводом, как минимум, 4 регистра микросхемы 8250 должны быть инициализированы для операций обмена. Это регистры делителя скорости обмена, регистр контроля линии и регистр разрешения прерывания.
1.5.3.1 Инициализация скорости обмена
Делитель скорости обмена - это число, на которое надо разделить частоту системных часов (1190000 герц), чтобы получить желаемую скорость обмена. Например, для скорости обмена 2400 бод делитель скорости обмена должен быть равен 48, поскольку 1190000/48 приближенно равно 2400. Чем больше делитель, тем меньше скорость обмена. Скорости обмена 300 и меньше требуют использования двухбайтного числа для делителя. Старший байт посылается в 3F9H (или 2F9H), а младший - в 3F8H (2F8H). В обоих случаях бит 7 регистра управления линии должен быть установлен в 1 перед засылкой значений; в противном случае по этим двум адресам значения будут адресованы в другие регистры. Вот некоторые значения, требуемые для достижения обычных номинальных скоростей обмена.
Скорость обмена 3F9H 3F8H
110 04H 17H
300 01H 80H
600 00H C0H
1200 00H 60H
1800 00H 40H
2400 00H 30H
3600 00H 20H
4800 00H 18H
9600 00H 0CH
В программах всегда устанавливайте регистры скорости обмена первыми, так как они единственные, которые требуют, чтобы был установлен бит 7 в регистре контроля линии. После этого надо изменить содержимое регистра контроля линии, сбрасывая 7-й бит, чтобы все остальные обращения к регистрам происходили корректно. Поскольку регистр контроля линии является регистром только для записи, то нет способа вернуть бит 7 обратно в 1 без одновременной установки всех остальных битов этого регистра.
1.5.3.2 Инициализация регистра контроля линии
Значение битов регистра контроля линии, адрес порта которого равен 3FBH (или 2FBH), следующее
биты 1-0 Длина посылки: 00 = 5 битов, 01 = 6 битов
10 = 7 битов, 11 = 8 битов.
2 Число стоп-битов: 0 = 1 бит, 1 = 1.5 бита, если длина
посылки равна пяти битам, иначе число
стоп-битов 2.
3 Четность: 1 = генерируется бит четности, 0 = нет.
4 Тип четности: 0 = нечетная, 1 = четная.
5 Фиксация четности. Значение 1 заставляет бит четности всегда быть 0 или 1, 0 = отменена фиксация.
Бит 5 = 1 - бит четности всегда 1, при условии, что
бит 3 = 1 & бит 4 = 0
или 1 - бит четности всегда 0, если
бит 3 = 1 & бит 4 = 1
или 1 - нет четности, если бит 3 = 0.
6 Установка перерыва (break). Вызывает вывод строки нулей
в качестве сигнала отдаленной станции.
0 = запрещено, 1 = перерыв.
7 Меняет адреса портов других регистров.
Обычно биты 5-7 сброшены в 0. Остальные описывают значения, определяемые протоколом обмена.
1.5.3.3 Регистр разрешения прерывания
Даже если Ваша программа не использует прерывания, все равно Вы должны произвести соответствующую запись в регистр разрешения прерывания, чтобы быть уверенным, что прерывания действительно запрещены. Просто произведите запись в этот регистр нулевого значения. Содержимое регистра идентификации прерывания можно игнорировать.
В нижеследующем примере из области данных BIOS берется базовый адрес COM1, после чего различные регистры инициализируются для скорости обмена 1200 бод, обмена семибитными данными, четной четности и одного стоп-бита.
;---получаем базовый адрес COM1
MOV AX,40H ;ES указывает на область данных BIOS
MOV ES,AX ;
MOV DX,ES:[0] ;получаем базовый адрес COM1
;---инициализируем регистры делителя скорости обмена на 1200 бод
ADD DX,3 ;указываем на регистр контроля линии
MOV AL,10000000B ;устанавливаем бит 7
OUT DX,AL ;посылаем байт
DEC DX ;указываем на старший байт делителя
DEC DX ;скорости обмена
MOV AL,0 ;старший байт для 1200 бод
OUT DX,AL ;посылаем старший байт для 1200 бод
DEC DX ;указываем на младший байт делителя
MOV AL,60H ;младший байт делителя для 1200 бод
OUT DX,AL ;посылаем младший байт
;---инициализируем регистр контроля линии
MOV AL,0 ;обнуляем AL
OR AL,10B ;длина данных 7 битов
OR AL,000B ;1 стоп-бит
OR AL,1000B ;генерируется бит четности
OR AL,10000B ;четная четность
ADD DX,3 ;указывает на регистр контроля линии
OUT DX,AL ;посылаем инициализационное значение
;---инициализируем регистр разрешения прерывания
DEC DX ;указываем на регистр разрешения
DEC DX ;прерывания
MOV AL,0 ;запрещаем прерывания
OUT DX,AL ;посылаем байт
1.5.3.4 Определение статуса коммуникационного порта
В микросхеме UART 8250 регистр статуса линии имеет адрес порта на 5 больше, чем базовый адрес данного канала. Этот регистр определяет протокол связи. В процессе коммуникационного обмена он обычно постоянно просматривается. В случае передачи данных содержимое регистра сообщает, что предыдущий символ уже послан, позволяя программе записать новый символ вслед за ним. При приеме данных регистр информирует программу о поступлении следующего символа, с тем чтобы она могла прочитать символ прежде, чем он будет уничтожен следующим прибывшим. Значение битов этого регистра следующее
бит 0 1 = байт данных получен
1 1 = полученные данные были перезаписаны (предыдущий
символ не был вовремя считан)
2 1 = ошибка четности (вероятно, из-за шума в линии)
3 1 = ошибка окружения (передача не синхронизована)
4 1 = обнаружен перерыв (получена длинная строка единиц,
означающая, что другая станция запрашивает конец
передачи)
5 1 = регистр хранения передатчика пуст (в этот регистр
должны помещаться передаваемые данные)
6 1 = регистр сдвига передатчика пуст (этот регистр полу-
чает данные из регистра хранения и преобразует их в
последовательный вид)
7 1 = таймаут (устройство не связано с машиной).
1.5.4 Посылка/получение данных с помощью коммуникационного прерывания
Хорошо написанная коммуникационная программа имеет обычно много работы помимо тривиального ввода/вывода. Так, в частности, поступающие данные должны анализироваться программой, передаваемые данные должны собираться, а большие блоки данных могут записываться на диск или считываться с него. Использование коммуникационного прерывания позволяет программе не тратить на ввод/вывод времени больше, чем он требует. Например, после установки прерывания, управление передается процедуре передачи данных только в том случае, когда регистр хранения передатчика пуст и возвращается программе, как только послан байт данных, позволяя ей продолжать свою работу до тех пор, пока регистр хранения передатчика не будет снова готов.
IBM PC отводит два аппаратных прерывания для коммуникационных каналов, номер IRQ4(COM1), т.е. 0Ch, и IRQ3 (COM2), т.е. 0Bh. Микросхема UART 8250 допускает 4 класса прерываний для каждого канала, используя следующие двоичные кодовые числа.
00 ошибка приема, или получено условие перерыва.
01 регистр хранения передатчика пуст, т.е. передатчик готов
отправить очередной символ
10 получены данные, которые помещены в регистр приемника
11 произошло изменение в регистре статуса модема
Указанные коды содержатся в битах 2-1 регистра идентификации прерывания, адрес порта которого на 2 больше, чем базовый адрес используемого коммуникационного адаптера. Бит 0 этого регистра устанавливается при возникновении прерывания, а остальные биты не используются и всегда равны 0. Для того чтобы выбрать одно или более прерываний, надо запрограммировать регистр разрешения прерывания, адрес которого на 1 больше базового адреса.
Значение его битов приведено ниже.
Биты 0 1 = прерывание при получении данных
1 1 = прерывание, когда регистр хранения
передатчика пуст
2 1 = прерывание при ошибке приема данных
3 1 = прерывание при изменении регистра статуса
модема
7-4 не используются, всегда 0.
В случае, когда одно из этих событий происходит, инициируется аппаратное прерывание, фиксируемое в микросхеме контроллера прерываний i8259 по каналу 4 для COM1 и по каналу 3 для COM2.
Аппаратная функция обработки прерываний, как известно, передает управление тому коду, на который указывает соответствующий вектор прерывания. Поскольку это аппаратное прерывание, то оно может быть маскировано через порт контроллера прерываний с адресом 21h. Кроме того, сброс флага разрешения прерывания при помощи команды CLI, как известно, запрещает реакцию процессора на любые внешние прерывания, кроме немаскируемого. Восстановление реакции на прерывания достигается путем установки флага при помощи команды STI. Важно помнить, что процедура обработки прерывания должна завершаться стандартным кодом выхода из аппаратного прерывания (сброс запроса с наивысшим приоритетом)
MOV AL,20H
OUT 20H,AL.
В реальной программе любое число типов прерывания может быть разрешено одновременно. При этом надо понимать, что если разрешен более чем один тип, то процедура обработки прерывания должна сама определять какой из типов прерывания произошел, проверяя регистр идентификации прерывания. Одновременно могут происходить более чем одно прерывание, поэтому бит 0 регистра идентификации сообщает о том, что поступил запрос на еще одно прерывание. Когда две или более причин для прерывания возникают в один и тот же момент времени, то соответствующие запросы обрабатываются в порядке, указанном в нижеприведенной таблице. Добавочные прерывания должны быть обработаны до завершения процедуры обработки прерывания. Условия предшествующих прерываний "отменяются" с помощью действий, приведенных в правом столбце следующей таблицы.
Таблица КодТипДействия для "сброса" причины прерывания 01
10
11
00передатчик готов получены данные изменение статуса модема
ошибка или перерыв вывод символа в регистр хранения передатчика чтение регистра приемника данных чтение регистра статуса модема чтение регистра статуса линии Анализ битов 7 и 6 регистра идентификации прерывания позволяет получить дополнительную информацию о вашем адаптере. В частности, код 00 означает, что запрещена работа FIFO или установлена устаревшая микросхема 8250, 11 - разрешена работа FIFO, 01 - разрешены FIFO и режим ПДП. Бит 3 используется для сигнализации тайм-аута. Он устанавливается в том случае, если приемный буфер FIFO содержит данные, которые необходимо прочитать. Это случается после небольшого промежутка времени, если в буфер не поступают новые данные.
Установка и сброс отдельных битов при программной записи в этот же порт позволяет управлять режимом FIFO UART 16550A. Установка бита 0 разрешает режим FIFO. Бит 1 при установке очищает приёмный буфер.
Второй бит очищает буфер передатчика. Бит 3 выбирает режим ПДП (на большинстве компьютеров не используется). Биты 7, 6 управляют прерываниями от приёмника. При разрешённой буферизации приёмник может генерировать прерывание для заданного количества символов: 00 - по 1 символу, 01 - по 4, 10 - по 8, 11 - по 14.
1.6 Программирование работы с COM-портом в ОС Windows ОС Windows зарезервировала имена от СОМ1 до СОМ9 для работы с СОМ-портами. Операционная система Windows 9x,ME в отличие от Windows NT не скрывает системные ресурсы компьютера, и прикладные программы имеют к ним непосредственный доступ. Благодаря этому под Windows 9x, ME успешно работают старые программы для MS DOS. Разрабатывая новые приложения Windows 9x, ME, можно пользоваться последовательными портами, вставляя в программу фрагменты на языке ассемблера, содержащие команды обращения к портам ввода/вывода процессора и вызовы функций DOS и BIOS. Но в многозадачном режиме такие приложения часто работают некорректно, сбиваясь и теряя информацию.
Правильнее обращаться с последовательными портами через встроенные в Windows 9x, ME функции WinAPI (API Application Programming Interface, интерфейс программирования приложений). Их полное описание можно найти в справочной системе MS SDK Help files, поставляемой со многими системами разработки приложений. Функции для работы с коммуникационным оборудованием описаны в разделе Communications файла Win32 Programmer's Reference.
Любые коммуникационные ресурсы, физические и логические устройства ввода/вывода с точки зрения Windows 9x, ME - одиночные двунаправленные асинхронные потоки данных. Их открывают, инициализируют и конфигурируют функцией CreateFile, закрывают CloseHandle. Для хранения параметров коммуникационных ресурсов определен тип tDCB (Device Control Block блок управления устройством) - структура, в полях которой задают скорость обмена, число бит в посылке, число стоп-бит, режим проверки на четность. Предусмотрены функции GetCommState и SetCommState, которыми читают и устанавливают эти параметры. Размер буферов ввода и вывода задают функцией SetupComm. Для чтения и записи в порт вызывают функции ReadFile, ReadFileEx, WriteFile, WriteFileEx.
Структура типа tCOMSTAT имеет поля cblnQueue и cbOutQueue, содержащие сведения о числе принятых байтов в буфере приема и числе еще не переданных в буфере передачи. Функция ClearCommError обновляет эту информацию и сообщает о возникших в процессе работы порта ошибках.
Ядро Windows 9x, ME, NT самостоятельно обрабатывает все события, возникающие при работе последовательных портов, настраивает прерывания и программирует контроллеры портов ввода/вывода, принимает и передает байты данных. Прикладной программе остается читать принятые данные из буфера приемника, а предназначенные для передачи - записывать в буфер передатчика. Эти операции обычно выполняют блоками с периодичностью, зависящей от скорости приема/передачи и объема буферов.
HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;
hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, /* exclusive access */NULL, /* no security attrs */ OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
if (hCom == INVALID_HANDLE_VALUE) { /* Обработка ошибок. */
}
/* Установка масок событий Com порта. */
fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);
if (!fSuccess) { /* Обработка ошибок */ }
/* Создать объект события для использования в функции WaitCommEvent. */
o.hEvent = CreateEvent
(NULL, /* no security attributes */ FALSE, /* auto reset event */ FALSE, /* not signaled */ NULL /* no name */);assert(o.hEvent);
if (WaitCommEvent(hCom, &dwEvtMask, &o)) { if (dwEvtMask & EV_DSR) {/** . . .*/ }
if (dwEvtMask & EV_CTS) { /** . . .*/}
}
//++++++++++++++++++++++++++++++++++++++
//Следующий пример открывает handle для COM1 и заполняет DCB структуру информацией о текущей конфигурации. Сама DCB структура затем модифицируется и используется для реконфигурации устройства. DCB dcb; HANDLE hCom; DWORD dwError; BOOL fSuccess;
hCom = CreateFile
("COM1", GENERIC_READ | GENERIC_WRITE, 0, /* comm devices must be opened w/exclusive-access */ NULL, /* no security attrs */ OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */ 0, /* not overlapped I/O */ NULL /* hTemplate must be NULL for comm devices */
);
if (hCom == INVALID_HANDLE_VALUE) { dwError = GetLastError();
/* Обработка ошибки handle */
}
/* Опускаем вызов SetupComm, используя размеры очередей по умолчанию. Получаем текущую конфигурацию. */
fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess) { /* Обрабатываем ошибку. *
}
/* Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit. */
dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT;
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess) { /* Обрабатываем ошибку. *
}
Далее описываются функции, используемые с коммуникационными устройствами. BuildCommDCBзаполняет указанную структуру DCB значениями, заданными в строке device-control string. Строка device-control string использует синтаксис команды mode. Функция BuildCommDCB лишь заполняет поля структуры DCB. Чтобы данные оказали воздействие на последовательный порт, используйте функцию SetCommState.
BuildCommDCBAndTimeouts транслирует строку определения устройства (device-definition string) в соответствующие поля device-control block, а затем помещает их в DCB. Функция также может устанавливать значения time-out, включая возможность работать без тайм-аута; поведение функции в этом отношении зависит от содержания строки device-definition string. ClearCommBreakвозобновляет передачу байтов указанным коммуникационным устройством и переводит линию передачи в состояние nonbreak. Коммуникационное устройство переводится в состояние break функциями SetCommBreak или EscapeCommFunction. Передача байтов после них приостанавливается до очистки состояния break путем вызова функции ClearCommBreak. ClearCommErrorвозвращает информацию об ошибке коммуникации и о состоянии коммуникационного устройства. Функция вызывается, когда случается коммуникационная ошибка и сбрасывает флаг ошибки устройства, без чего не разрешаются дальнейшие операции ввода и вывода. Если коммуникационный порт был настроен так, что в конфигурационной структуре DCB поле fAbortOnError установлено в состояние TRUE, коммуникационное ПО прекратит все операции ввода/вывода с коммуникационным портом после случившейся ошибки. Никакие операции ввода или вывода не будут приниматься до тех пор, пока приложение не обработает ошибку вызовом функции ClearCommError. CommConfigDialogвыводит стандартный диалог настройки устройства, поставляемый драйвером устройства. Функция CommConfigDialog требует динамическую библиотеку (DLL), поставляемую производителем оборудования.
DeviceIoControlпосылает управляющий код непосредственно драйверу указанного устроойства, заставляя соответствующее устройство выполнить указанную операцию. Функция DeviceIoControl выполняется как асинхронная операция или операция с перекрытием (overlapped), если устройство hDevice было открыто с установленным флагом FILE_FLAG_OVERLAPPED и параметр lpOverlapped указывает на структуру OVERLAPPED. В этом случае структура OVERLAPPED должна содержать индекс сбрасываемого объекта события (manual-reset event object), созданного вызовом функции CreateEvent.
EscapeCommFunctionуказывает коммуникационному устройству на необходимость выполнить расширенную функцию. Сбрасывает сигналы DTR (data-terminal-ready), RTS (request-to-send), посылает DTR (data-terminal-ready), RTS (request-to-send), заставляет передачу переходить в режим, соответствующий приему байта XOFF, приостанавливать передачу байтов и переводить линию в состояние break до вызова функции ClearCommBreak (или вызова EscapeCommFunction с расширенным кодом CLRBREAK) и т.д.
GetCommConfigполучение текущей конфигурации коммуникационного устройства.
GetDefaultCommConfigполучение конфигурации коммуникационного устройства по умолчанию.
GetCommMaskвозвращает значение маски события для заданного коммуникационного устройства, использует 32-битную переменную (mask) для индикации набора событий, которые могут отслеживаться для данного коммуникационного ресурса. Индекс (handle) коммуникационного ресурса может быть проанализирован при вызове функции WaitCommEvent, которая ожидает возникновения какого-либо из событий. Для модификации маски событий коммуникационного ресурса используйте функцию SetCommMask. GetCommModemStatusвозвращает значения из регистра состояния модемом, которое используется при вызове функции WaitCommEvent для отслеживания сигналов CTS, RLSD, DSR, или сигнала индикации вызова - ring indicator. Чтобы узнать, когда эти сигналы меняют состояние, используйте WaitCommEvent, а затем вызывайте GetCommModemStatus, чтобы узнать состояние сигналов, после того, как изменение произошло. GetCommProperties заполняет буфер информацией о параметрах заданного коммуникационного устройства, возвращает информацию от драйвера устройства о настройках, поддерживаемых драйвером. GetCommTimeouts возвращает параметры тайм-аута для всех операций чтения и записи с заданным коммуникационным устройством, для более подробной информации о значениях тайм-аута для коммуникационного устройства см. функцию SetCommTimeouts. GetCommState функция заполняет блок управления устройством device-control block (DCB структура) текущими управляющими настройками для заданного коммуникационного устройства. PurgeComm может аннулировать все символы из выходного или входного буфера заданного коммуникационного ресурса. Может также прекращать ожидание операций ввода или вывода на ресурсе. Если программный поток использует функцию PurgeComm для опустошения (flush) выходного буфера, аннулированные символы не передаются. Чтобы опустошить выходной буфер и быть уверенным, что его содержимое передано, вызывайте функцию FlushFileBuffers (синхронная операция). Обратите, однако, внимание, что на работу функции влияют настройки, связанные с управлением потоком, но не влияют настройки, задающие тайм-ауты. Возврат из функции не произойдет до окончания всех ожидающих операций вывода.
SetDefaultCommConfigустанавливает конфигурацию по умолчанию для коммуникационного устройства.
SetCommBreakприостанавливает передачу символов для заданного коммуникационного устройства и переводит линию связи в состояние перерыва - break до момента вызова функции ClearCommBreak, при этом не производится очистка буфера передачей оставшихся в нем байтов. SetCommState конфигурирует коммуникационное устройство в соответствии со спецификацией, заданной в блоке управления устройством (DCB). Функция реинициализирует все настройки оборудования и управления, но не опустошает выходные или входные очереди. SetupComm инициализирует коммуникационные параметры для заданного коммуникационного устройства. SetCommConfig после того как в процессе используется вызов CreateFile для открытия индекса (handle) коммуникационного устройства, он может вызвать SetupComm для установки коммуникационных параметров для устройства. Если процесс не установит их явно, устройство будет использовать параметры по умолчанию в момент вызова первой из последующих коммуникационных функций. SetCommMask определяет набор событий, которые будут отслеживаться для данного коммуникационного устройства. Индекс (handle) коммуникационного ресурса может быть задан при вызове функции WaitCommEvent, которая ожидает наступления одного из событий. Для получения текущей маски событий данного коммуникационного ресурса используйте функцию GetCommMask. Если SetCommMask вызывается для коммуникационного ресурса, в то время как этот ресурс ожидается в режиме перекрытия (overlapped) функция WaitCommEvent вернет ошибку. SetCommTimeouts устанавливает параметры тайм-аута для всех операций ввода и вывода на заданном коммуникационном устройстве. TransmitCommCharпередает заданный символ вне очереди, впереди любых ожидающих в выходном буфере данных указанного коммуникационного устройства, функция полезна для посылки прерывающего символа (такого как CTRL+C) хост - системе. Может вызываться только синхронно.
WaitCommEvent ожидает возникновения события для заданного коммуникационного устройства. Набор событий, отслеживаемых данной функцией, содержится в маске событий, ассоциированной с индексом (хэндлом) устройства. Для установки и проверки текущей маски событий коммуникационного ресурса используйте функции SetCommMask и GetCommMask. CreateFile создает или открывает объекты и возвращает handle, который может быть использован для доступа к объекту. Функция CreateFile может создавать handle для коммуникационного ресурса, такого как последовательный порт(COM1, COM2 и т.д.). для коммуникационных ресурсов параметр dwCreationDistribution должен быть OPEN_EXISTING, а параметр hTemplate должен быть NULL. Должен быть задан доступ для операций Read, write, или read-write. Handle также может быть открыт для перекрывающихся во времени (асинхронных или overlapped) операций ввода/вывода.
ReadFile (WriteFile для вывода) при чтении из коммуникационного устройства поведение функции ReadFile управляется текущими коммуникационными тайм-аутами, устанавливаемыми и считываемыми функциями SetCommTimeouts и GetCommTimeouts.
ReadFileEx(WriteFileEx для вывода) считывает данные из файла асинхронно. Она разработана только для асинхронных операций, в отличие от функции ReadFile, которая используется как для синхронных, так и для синхронных операций. Функция ReadFileEx позволяет приложениям осуществлять другие виды обработки во время операции файлового чтения.
Алгоритм программирования СОМ-порта с помощью API-функций: 1. Для работы с СОМ-портом необходимо открыть порт с помощью API функции CreateFile:
2. После открытия СОМ порта можно передавать и принимать данные через этот СОМ-порт. Для передачи данных используется API функция WriteFile. Для приёма данных используется API функция ReadFile.
3. После окончания работы с портом его нужно закрыть. Закрытие порта осуществляется API функцией CloseHandle.
4. Настройка режима работы СОМ-порта осуществляется с помощью структур данных, которые представляют из себя набор переменных разного типа. Структуру загружаются и читаются с помощью API функций.
Структура DCB определяет основные настройки СОМ порта. COMMPROP структура сообщает информацию о свойствах коммуникационного устройства. 1.7 Стандарт Modbus
Широкое распространение получили промышленные сети Modbus, Bitbus, Canbus. На базе схемотехнических решений интерфейса RS-485 были созданы полевые шины (Fieldbus), которые отличаются друг от друга именно протоколом передачи. Их примерами могут служить такие интерфейсы как: CAN, IEC 1158-2, Bitbus (IEEE 1118), Modbus. HART, Conitel, DEI, Data Highway, Data Highway Plus, Modbus Plus, Profibus DP, ISP SP- 50, FIPIO, Since, DNP, Profibus FMS, CAN Open, и ряд других интерфейсов. Сеть Modbus имеет следующие основные характеристики: * физические порты RS-232C, RS-422, RS-485, * токовая петля 20 мА; * среда передачи не специфицирована; * метод доступа ведущий/ведомый; * число узлов - 1 ведущий и 247 ведомых; * скорость передачи данных - 19,2 кбит/с; * длина сети до 1,2 км при RS-422, RS-485.
Состав открытого стандарта Modbus
Документ Modbus over serial line содержит спецификацию канального и физического уровней сетевой модели OSI для физических уровней RS485 и RS232.
Контроллеры на шине Modbus взаимодействуют, используя клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа.
Обычно в сети есть только один клиент - "главное" (англ. master) устройство, и несколько серверов - "подчиненных" (slaves) устройств. Главное устройство инициирует транзакции (передаёт запросы). Главный может адресоваться индивидуально к подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчиненное устройство отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ не формируется.
Спецификация Modbus описывает структуру запросов и ответов. Их основа - элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи. Существуют три варианта ADU, два для передачи данных через асинхронный интерфейс и один - через TCP/IP сети:
* Modbus ASCII - для обмена используются только ASCII символы. Для проверки целостности используется однобайтовая контрольная сумма. Начало и конец сообщения помечаются специальными символами (начало сообщения ": ", конец сообщения CR/LF).
* Modbus RTU - компактный двоичный вариант. Сообщения разделяются по паузе в линии, контроль целостности с помощью CRC.
* Modbus TCP - для передачи данных через TCP/IP соединение.
Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):
адрес ведомого устройствакод функцииданныеблок обнаружения ошибок
RTU фрейм
В RTU режиме сообщение должно начинаться и заканчиваться интервалом тишины - временем передачи не менее 3,5 символов при данной скорости в сети. Первым полем передаётся адрес устройства.
Рис. Пример передаваемых данных по Modbus протоколу
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3,5 символов. Новое сообщение может начинаться после этого интервала.
Фрейм сообщения передаётся непрерывно. Если интервал тишины длительностью 1,5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный.
Таким образом, новое сообщение должно начинаться не раньше 3,5 интервала, так как в этом случае устанавливается ошибка.
Serial Modbus RTU: при скорости 9600 и 11 битах в кадре (стартовый бит + 8 бит данных + бит контроля чётности + стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), то есть более 4 мс; 1.5 * 11 / 9600 = 0,00171875, то есть более 1 мс. Для скоростей более 19200 бод допускается использовать интервалы 1,75 и 0,75 мс соответственно.
Программная реализация протокола Modbus поверх RS-232 реализована, например, в библиотеке libmodbus.
Общение между двумя устройствами Master и Slave проиллюстрировано программами bandwidth-server-one и bandwidth-client.exe.
Контекст библиотеки libmodbus для обмена двоичными сообщениями поверх интерфейса RS-232 (Modbus RTU) создается с помощью функции modbus_new_rtu.
modbus_t *modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit);
В Windows, необходимо предварять имя порта \\.\ для COM, если номер меньше 9, и \\\\.\\COM10. Далее определяется скорость обмена информацией: 9600, 19200, 57600, 115200, etc.
Флаг четности:
•N for none •E for even •O for odd data_bits определяет количество бит данных в пакете (5, 6, 7 или 8)
stop_bits определяет количество стоп-битов (1 или 2).
1.8 Задание
1. С помощью программы Virtual Serial Ports Emulator необходимо создать пару виртуальных портов с именами COM5 и COM6
Рис. Главное окно приложения
Рис. Диалог создания пары связанных виртуальных портов
2. Протестировать приложение обмена текстовыми данными Server и Client
2.1 Запустить приложение Lab_1\comports\server\server.exe
2.2 Запустить приложение Lab_2\comports\client
2.3 Осуществить обмен информацией между двумя приложениями через связанную пару виртуальных портов. 2.4 Проанализировать исходный код каждого приложения и вынести в отчет исходный код, отвечающий за процедуру подключения к портам и обмена информацией.
3. Протестировать процедуру обмена через виртуальные COM-порты двух приложений: Master и Slave, осуществляющих пересылку данных по протоколу Modbus. 3.1 Пути для запуска с обязательным ключом rtu:
Master: Lab_1\libmodbus-3.0.3\tests\bandwidth-server-one.exe rtu
Slave: Lab_1\libmodbus-3.0.3\tests\bandwidth-client.exe rtu
3.2 Проанализировать скорость работы, время работы и объемы пересылаемых данных.
4. Необходимо ознакомиться с основными программно - доступными элементами адаптера.
4.1. Необходимо с использованием приведенных в теоретической части указаний примеров написать клиентскую и серверную программы на языке ассемблера i8086 и/или языке Си для реализации обмена через последовательный порт по вводу и выводу (резидентную или нерезидентную, с использованием WIN API или с использованием прерываний)
4.2. Отладить и протестировать программы.
1.9 Требования к содержанию и оформлению отчета
Отчет оформляется на листах формата А4 а соответствии с требованиями стандартов ЕСКД. Отчёт о лабораторной работе должен содержать:
1. название, цель и задачи работы;
2. скриншоты процедуры создания пары виртуальных портов, краткая характеристика программы создания;
3. скриншоты тестирования обмена данными через пару виртуальных портов с помощью программ Client и Server, ключевые участки исходного кода приложений, описание используемых библиотек.
4. скриншоты обмена данными между клиентом и сервером по протоколу Modbus, краткая характеристика библиотеки libmodbus.
5. исходный код приложений, осуществялющих обмен данными по одному из вариантов использования COM-порта: низкоуровневое приложение на языке ассемблера, приложение на языке С, использующее механизм прерываний, или приложение, использующее API Windows NT.
6. выводы о проделанной работе в целом. 1.10 Список литературы
* http://libmodbus.org/
* http://www.modbus.org/
* Солдатов Е. А., Кардаш Д. И. Автоматизированные системы реального времени: Учебное пособие / Е.А. Солдатов, Д. И. Кардаш Уфимск. гос. авиац. техн. ун-т, Воронеж: Гос. тех. ун-т. - Уфа: УГАТУ, 2005. - 115 с.
* Web - страница http://www.codenet.ru/progr/other/comport.php
* Джордейн Р. Справочник программиста персональных компьюте-ров фирмы IBM PC XT и AT. - М.: Финансы и статистика, 1991.
* Абель П. Язык Ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992.
* Hортон П. Персональный компьютер фирмы IBM и операцион-ная система MS-DOS. - М.: Радио и связь, 1992.
1.11 Контрольные вопросы
1. В чем заключается старт-стопный способ синхронизации?
2. Какое напряжение соответствует логической единице в интерфейсе RS232? 3. В чем заключаются особенности использования последовательного интерфейса RS-232С? 4. Опишите организацию сопряжения двух устройств через RS-232С.
5. Охарактеризуйте внутреннее аппаратное устройство, разъем и кабель порта RS-232С? 6. Объясните порядок обмена по интерфейсу RS-232С. 7. Приведите типы последовательных интерфейсов и опишите их особенности. 8. Опишите особенности программирования интерфейса RS-232С.
9. Что такое протокол Modbus, где и в каких линиях связи он используется? 10. Как осуществляется обмен данными при использовании Modbus протокола?
11. Какие режимы передачи данных предусмотрены в исследуемом протоколе, в чем их различие? 12. Какие скорости передачи данных используются при работе с протоколом передачи данных Modbus?
13. Каким образом реализована в адаптере последовательного канала возможность программного задания скорости обмена?
14. Какие возможности по повышению надежности передачи информации предусмотрены в адаптере, и какие регистры используются для программирования соответствующих функций?
15. Как программно определить причину произошедшего прерывания в подпрограмме обработки прерывания?
ПРИЛОЖЕНИЕ 1
Ниже приведен текст программы gen_232w.c, предназначенной для проведения проверки корректности работы резидентной программы, осуществляющей прием и отображение информации (в том числе и статусной) из последовательного канала по прерываниям. Программа, находясь в непрерывном цикле while, выход из которого возможен при нажатии на клавишу ESC, периодически выполняет вывод очередного байта информации в коммуникационный порт, проверив предварительно с помощью функции bioscom(3,..) готовность передатчика. Для анализа клавиатурного буфера использована соответствующая функция BIOS клавиатуры (см. bioskey(1)). Важно обратить внимание на то, что данная программа не выполняет никаких действий по инициализации коммуникационного порта.
Предполагается, что соответствующую работу берет на себя предварительно загружаемая резидентная программа - приемник.
Помимо этой, генерирующей непрерывную последовательность символов программы, темп работы которой согласован с пропускной способностью последовательного канала, необходимо использовать для проверки корректности работы резидентной программы-приемника и программу gen_232n.c, которая отличается от gen_232w.c отсутствием проверки готовности передатчика перед засылкой в него очередного символа (см. функцию outportb(com_port, out++); ) при помощи условного оператора if (bioscom(3,0,COM1) & DATA_READY) ...
Указанная особенность приводит к тому, что при использовании gen_232n.c периодически должна возникать ошибка, связанная с несогласованностью темпа загрузки символов в регистр передатчика и пропускной способностью канала (скоростью передачи).
В связи с отсутствием иных различий между программами gen_232w.c и gen_232n.c Текст последней здесь не приводится.
/******* Текст программы генерации символов gen_232w.c *******/
#include <bios.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define TRUE 1
#define FALSE 0
#define COM1 0
#define DATA_READY 0x2000
/* Базовый адрес первого коммуникационного порта - COM1, адрес регистра состояния линии - РСЛ = COM1+5 */
int main(void)
{ char out = 0;
int DONE = FALSE;
unsigned int com_port=peek(0x0, 0x400); /* Базовый адpес первого коммуникационного порта BIOS хранит по этому адресу в ОЗУ */
/*****************************************************************/
textbackground(BLACK); clrscr(); textcolor(GREEN);
cprintf(" Адpес COM1: %4x\n", com_port);
textbackground(RED); textcolor(YELLOW); gotoxy(1,3);
cprintf("... Hажмите клавишу [ESC] для выхода ...\n");
while (!DONE)
{ /* Ожидание любой нажатой клавиши */
while (bioskey(1)==0)
{if (bioscom(3,0,COM1) & DATA_READY)
outportb(com_port, out++);
/* Переменный код - в буфер передатчика */
}
if (getch() == '\x1B') DONE = TRUE; /* Есть ESC ! */
} /* Цикл завершится по нажатии клавиш ESC */
return 2;
}
Помимо рассмотренных вспомогательных программ gen_232w.c и
gen_232n.c рекомендуется использовать при выполнении лабораторной работы для контроля функционирования последовательного канала и резидентной программы - приемника нерезидентную программу - передатчик s_232out.c, текст которой на языке Си приводится ниже. Эта программа в качестве передаваемой информации использует коды символов, введенные с клавиатуры. Естественно, что темп передачи при этом полностью определяется частотой нажатия на клавиши.
/******* Текст программы передачи символов s_232out.c *******/
#include <bios.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define TRUE 1
#define FALSE 0
/* Базовый адрес первого коммуникационного порта - COM1,
адрес регистра состояния линии - РСЛ = COM1+5 */
int main(void)
{ int i; char *text=" ";
int in=' ', DONE = FALSE;
unsigned int com_port=peek(0x0, 0x400); /* Базовый адрес первого коммуникационного порта BIOS хранит по этому адресу в ОЗУ */
**************************************************************/
textbackground(BLACK); clrscr(); textcolor(GREEN);
cprintf(" Адрес COM1: %4x\n", com_port);
gotoxy(1,3); cprintf
("... Hажимайте клавиши для передачи символов, [ESC] для
выхода...\n");
textbackground(RED); textcolor(YELLOW);
while (!DONE)
{
{
gotoxy(10,10); /* Hиже распечатка содержимого Рег. Сост. Линии */
cprintf ("РСЛ: %2x", (inportb(com_port+5) & 0xff)); gotoxy(10,12);
for (i=0;i<31;i++) text[i]=text[i+1]; text[31]=in; cprintf (text);
}
while (kbhit()==0); /* Ожидание нажатой клавиши */
if ((in = getch()) == '\x1B') DONE = TRUE; /* Есть ESC ! */
outportb(com_port, in); /* Код клавиши - в буфеp передатчика */
} /* Цикл завершится по нажатии клавиш ESC */
return 2; }
Тексты приведенных программ gen_232w.c, gen_232n.c и s_232out.c по рекомендации преподавателя могут быть скорректированы силами студентов с учетом конкретных особенностей проводимого занятия.
ПРИЛОЖЕНИЕ 2
Кабели последовательной связи
При подключении через последовательные порты COMn можно использовать стандартные 25-пиновые (штырьковые) или 9-пиновые (или 25-на-9 пиновые) кабели последовательной связи. У кабелей должны быть разъёмы типа "розетка" (female) на обоих концах. Для нормальной передачи данных используются лишь три провода (реально лучше 2 витые пары):
9-штырьковый (25) 9-штырьковый (25)
соединитель соединитель
пин 5 (7) === (земля - земля) ==== пин 5 (7)
пин 5 (7) === (земля - земля) ==== пин 5 (7)
пин 3 (2) == (передатч.- приёмник) == пин 2 (3)
пин 2 (3) == (приёмник - передат.) == пин 3 (2)
Более полный по составу кабель позволяет, например, обеспечить аппаратное управление потоком:
9-штырьковый (25) 9-штырьковый (25)
соединитель соединитель
пин 5 (7) === (земля - земля) ===== пин 5 (7)
пин 3 (2) == (передатч.- приёмник) === пин 2 (3)
пин 7 (4) ====== (RTS - CTS) ====== пин 8 (5)
пин 6 (6) ====== (DSR - DTR) ===== пин 4 (20)
пин 2 (3) == (приёмник - передат.) === пин 3 (2)
пин 8 (5) ====== (CTS-to-RTS) ===== пин 7 (4)
пин 4 (20) ====== (DTR-to-DSR) ===== пин 6 (6)
2
Р.А. Гараев, А.М. ВульфинЛабораторные работы СЭТ
1
Р.А. Гараев, А.М. ВульфинЛабораторные работы СЭТ
Документ
Категория
Рефераты
Просмотров
303
Размер файла
742 Кб
Теги
lab
1/--страниц
Пожаловаться на содержимое документа