Примеры программирования обмена данными через последовательный порт |
Главная / ЭКВМ / Программы / Примеры |
Здесь приведено несколько примеров программ, которые выполняют обмен данными через последовательный порт.
Порядок действийДля передачи данных через последовательный порт нужно выполнить следующие действия:
Если после передачи требуется приём ответа:
Для ожидания передачи данных через последовательный порт:
Передача производится по прерываниям микроконтроллера в фоновом для программы ЭКВМ режиме. Поскольку в приведённых примерах обмен по порту является основной задачей, в них для ожидания завершения операции используются проверки в цикле. В реальных программах имеет смысл использовать механизм прерываний программы пользователя. Прерывания позволяют отследить окончание передачи (R9154), приёма (R9155) или тайм-аута (R9158) и выполнить необходимые действия без постоянного опроса регистров. После окончания работы с портом в программе рекомендуется запретить использование порта программой ЭКВМ (записать 0 в R9070), чтобы порт был доступен для приёма команд по протоколу обмена. Значение регистра R9070 после окончания работы программы или остановки и запуска командой "С/П" автоматически не изменяется. Приводимые ниже примеры, для большей наглядности, составлены без оптимизации. 1. Передача и приём одного байтаПередача одного байтаТекст программы для кросс-компилятора (в латинской транскрипции, с использованием меток и псевдооператоров) Программа prim1.mkl .CHARSET 1251 ; Пример 1. Передача одного байта '?' из ЭКВМ во внешнее устройство, в том числе в компьютер. ; Скорость 2400, 8 бит, без контроля чётности. 1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ ; С этого момента и до записи 0 команды протокола обмена данными ; из документа Д2 не обрабатываются. 5 PP M 9071 ; Установить скорость 2400 0 PP M 9072 ; Установить режим 8 бит 0 PP M 9080 ; Индексный регистр буфера передачи. Запись нуля - заполнение буфера с начала 63 PP M 9081 ; Записать код символа '?' в буфер приёма без автоинкремента индексного регистра 1 PP M 9077 ; Количество передаваемых байт - 1, передача начинается при выполнении этой команды A1: PP RM 9077 ; Проверить окончание передачи байта, ; считав количество оставшихся байт из регистра передачи F X=0 A1 ; пока оно не равно 0 - продолжать считывание 0 PP M 9070 ; Запрет использования порта программой ЭКВМ R/S ; Останов .ENDP На языке МК (на экране ЭКВМ) этот пример будет выглядеть так:
Для удобочитаемости программу можно записать в кратком виде. Программа prim1.mkp (КС 20854/212)
Приём одного байтаЭта программа принимает и выводит байт, передаваемый предыдущей программой. Программа prim10.mkl .CHARSET 1251 ;Для примера 1. Приём одного байта ЭКВМ ;Скорость 2400, 8 бит, без контроля чётности. 1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ ; С этого момента и до записи 0 команды протокола обмена данными ; из документа Д2 не обрабатываются. 5 PP M 9071 ; Установить скорость 2400 0 PP M 9072 ; Установить режим 8 бит 16 PP M 9073 ; Задержка между байтами при приёме 16*1,25=20 мс. 1 PP M 9076 ; Приём A1: PP RM 9076 ; Проверить окончание приёма F X=0 A1 ; пока не равно 0 - продолжать считывание 0 PP M 9070 ; Запрет использования порта программой ЭКВМ 0 PP M 9085 PP RM 9086 PP RM 9075 R/S ; Останов RX- количество, RY - первый байт пакета .ENDP Программа prim10.mkp (КС 20338/214)
Файлы примераПередача и приём нескольких байт, работа с буферомПередача одного байта и переключение на автоматический приёмПрограмма передаёт запрос и ожидает ответ. Ответ проверяется, в случае удовлетворения заданному условию выдаётся звуковой сигнал. Программа prim2.mkl .CHARSET 1251 ; Пример 2. Передача '?' и приём нескольких байт с проверкой на первый символ '!'. ; Cкорость 4800, 8 бит, без контроля чётности 1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ 7 PP M 9071 ; Установить скорость 4800 0 PP M 9072 ; Установить режим 8 бит 8 PP M 9073 ; Задержка между байтами в ответе 8*1,25=10 мс. 0 PP M 9074 ; Режим автоматического приёма разрешён 160 PP M 9078 ; Время ожидания ответа 160*1,25=200 мс. 0 PP M 9080 ; Индексный регистр буфера передачи. Запись нуля - заполнение буфера с начала 63 PP M 9081 ; Записать код символа '?' в буфер приёма без автоинкремента индексного регистра 1 PP M 9077 ; Количество передаваемых байт - 1, передача начинается при выполнении этой команды A1: PP RM 9077 ; Проверить окончание передачи байта, ; считав количество оставшихся байт из регистра передачи F X=0 A1 ; пока оно не равно 0 - продолжать считывание ; После окончания передачи приём начинается автоматически, ; при этом в R9076 записывается значение 1. A2: PP RM 9076 ; Проверить окончание приёма, считав содержимое регистра приёма F X=0 A2 ; пока оно не равно 0 - продолжать считывание ; Приём окончен, количество принятых байт в R9075, ; пакет для обработки в буфере приёма (R9086-R9089) PP RM 9075 ; Проверка количества принятых байт F X!=0 A3 ; Выход при нулевом значении 0 PP M 9085 ; Индексный регистр буфера приёма, запись 0 - выбрать первый байт PP RM 9086 ; Считать первый байт без автодекремента 33 - ; Вычесть код символа '!' F X=0 A3 ; Если не '!' - выход 2000 ENT 25 ; Если '!' - установить параметры 2000 Гц и 250 мс PP M 9052 ; Подать звуковой сигнал A3: 0 PP M 9070 ; Запрет использования порта программой ЭКВМ PP RM 9075 ; Вывод количества принятых байт R/S ; Останов .ENDP Программа prim2.mkp (КС 13573/15)
Ожидание и выдача ответаЭта программа ожидает запрос от предыдущей, проверяет принятый байт и передаёт ответ из двух байт, следующих в случайном порядке. При успешном приёме и передаче выводится сообщение в строке комментариев. Программа prim20.mkl .CHARSET 1251 ;Для примера 2. Приём одного байта, выдача пакета "?!" или "!?" ;Скорость 4800, 8 бит, без контроля чётности. 1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ 7 PP M 9071 ; Установить скорость 4800 0 PP M 9072 ; Установить режим 8 бит 16 PP M 9073 ; Задержка между байтами при приёме 16*1,25=20 мс. 1 PP M 9076 ; Приём A1: PP RM 9076 ; Проверить окончание приёма F X=0 A1 ; пока не равно 0 - продолжать считывание 0 PP M 9085 PP RM 9086 ; Первый байт 63 - F X=0 A2 ; Если не '?' - не выводить сообщение .NUM TXT1 PP M 9026 ; Вывести сообщение "Принят ?" в строку комментариев A2: ; Ответ 0 PP M 9080 ; Индексный регистр буфера передачи. ; Запись нуля - заполнение буфера с начала KRAN 2 * KINT F X=0 A3 63 PP M 9082 ; Записать код символа '?' в буфер передачи с автоинкрементом 33 PP M 9082 ; Записать код символа '!' в буфер приёма с автоинкрементом .NUM TXT2 PP M 9026 ; Вывести сообщение "?!" в строку комментариев GOTO A4 A3: 33 PP M 9082 ; Записать код символа '!' в буфер приёма с автоинкрементом 63 PP M 9082 ; Записать код символа '?' в буфер приёма с автоинкрементом .NUM TXT3 PP M 9026 ; Вывести сообщение "!?" в строку комментариев A4: 2 PP M 9077 ; Количество передаваемых байт - 2, ; передача начинается при выполнении этой команды A5: PP RM 9077 ; Проверка окончания передачи F X=0 A5 0 PP M 9070 ; Запрет использования порта программой ЭКВМ R/S TXT1: .TEXT "Принят '?' - \0" TXT2: .TEXT "?!\0" TXT3: .TEXT "!?\0" .ENDP Программа prim20.mkp (КС 31495/9)
Файлы примераОжидание и передача пакета, проверка чётностиОжидание посылки, проверка чётности, подсчёт контрольной суммыПрограмма принимает пакет, подсчитывает количество принятых байт и их сумму, одновременно подсчитывается количество ошибок чётности при обмене. Программа prim3.mkl .CHARSET 1251 ; Пример 3. Ожидание посылки (менее 200 байт) от внешнего устройства, в том числе компьютера. ; Проверка чётности и подсчёт контрольной суммы принятого пакета. ; Скорость 9600, 8 бит данных, контроль чётности ; Используются регистры R0, R1, R2 0 M1 M2 ; Обнулить R1 (здесь будет подсчёт ошибок чётности) ; и R2 (контрольная сумма) 1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ 9 PP M 9071 ; Установить скорость 9600 1 PP M 9072 ; Установить режим 9 бит 16 PP M 9073 ; Задержка между байтами при приёме 16*1,25=20 мс. 1 PP M 9076 ; Запись 1 в регистр приёма, приём начинается при выполнении этой команды ; Ожидание первого байта без ограничения времени, ; последующих - в соответствии с R9073 A1: PP RM 9076 ; Проверить окончание приёма, считав содержимое регистра приёма F X!=0 A2 ; пока оно не равно 0 - продолжать считывание, если равно - перейти к A2 PP RM 9075 ; Если приём не окончен, проверить количество принятых байт, 200 - ; Сравнить с 200 F X>=0 A1 ; Если больше - перейти к А2 A2: PP RM 9075 ; Считать количество принятых байт F X!=0 A5 ; При нулевом значении - выход M0 ; Загрузить количество принятых байт в R0 для организации цикла 0 PP M 9085 ; Индексный регистр буфера приёма - выбрать первый байт из буфера A3: PP RM 9086 ; Считать очередной байт (8 бит данных) ; без автоинкремента индексного регистра ENT ; Скопировать в регистр RY стека RM2 + M2 ; Добавить к контрольной сумме <-> ; Вернуть значение в RX путём обмена RX и RY в стеке PP M 9040 ; Вычислить чётность байта из RX PP RM 9089 ; Прочитать 9-й бит принятых данных (чётность) ; с автоинкрементом индекса. Автоинкремент нужен, ; чтобы в следующем цикле считать очередной байт пакета - ; Сравнить вычисленную чётность с принятой F X!=0 A4 ; Если совпадает - обойти инкремент счётчика ошибки RM1 1 + RM1 ; Инкремент ошибки чётности A4: FL0 A3 ; Цикл по R0 - по всем принятым байтам A5: RM1 ; Вывести флаг ошибки чётности RM2 ; Вывести контрольную сумму PP RM 9075 ; Вывод количества принятых байт 0 PP M 9070 ; Запрет использования порта программой ЭКВМ FR ; Перевод ноля в RT стека R/S ; Останов ; В RX - количество принятых байт, RY-контрольная сумма, ; RZ - количество ошибок .ENDP Программа prim3.mkp (КС 13467/211)
Генерация пакетаЭта небольшая программа передаёт пакет с установленными битами чётности для предыдущей. Программа prim30.mkl .CHARSET 1251 ;Для примера 3. Генерация пакета из 40 байт 01h ;Скорость 9600, 8 бит данных, c контролем чётности. 1 PP M 9070 ; Разрешение порта, запись 1 - разрешение использования порта ЭКВМ 9 PP M 9071 ; Установить скорость 9600 1 PP M 9072 ; Установить режим 8 бит 0 PP M 9080 ; Индексный регистр буфера передачи. ; Запись нуля - заполнение буфера с начала 40 M0 A1: 1 PP M 9081 ; Записать символ 01h в буфер передачи ; без автоинкремента индексного регистра 1 PP M 9084 ; Записать чётность 1 в буфер передачи ; с автоинкрементом индексного регистра FL0 A1 40 PP M 9077 ; Передача 40 байт A2: PP RM 9077 ; Проверить окончание F X=0 A2 ; пока не равно 0 - продолжать 0 PP M 9070 ; Запрет использования порта программой ЭКВМ R/S .ENDP Программа prim30.mkp (КС 19281/215)
Файлы примера |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |