Примеры программирования обмена данными через последовательный порт


Главная / ЭКВМ / Программы / Примеры
Здесь приведено несколько примеров программ, которые выполняют обмен данными через последовательный порт.

Порядок действий

Для передачи данных через последовательный порт нужно выполнить следующие действия:

  • разрешить использование последовательного порта программой ЭКВМ (R9070);
  • настроить параметры обмена: скорость, режим, время ожидания (R9071-R9074);
  • сформировать передаваемую последовательность в регистре буфера передачи (R9080-R9084);
  • отдать команду передачи данных (R9077).

Если после передачи требуется приём ответа:

  • при настройке рекомендуется включить режим автоматического приёма (R074) и настроить время ожидания ответа (R9078);
  • окончание приёма можно отслеживать по тайм-ауту через прерывание (R9155) или контролем количества принятых байт (R9075);
  • после окончания приёма принятая последовательность считывается из буфера приёма (R9085-R9089).

Для ожидания передачи данных через последовательный порт:

  • разрешить использование последовательного порта программой ЭКВМ (R9070);
  • настроить параметры обмена: скорость, режим, время ожидания (R9071-R9074);
  • отдать команду приёма данных (R9076);
  • окончание приёма можно отслеживать по тайм-ауту через прерывание (R9155) или контролем количества принятых байт (R9075);
  • после окончания приёма принятая последовательность считывается из буфера приёма (R9085-R9089).

Передача производится по прерываниям микроконтроллера в фоновом для программы ЭКВМ режиме. Поскольку в приведённых примерах обмен по порту является основной задачей, в них для ожидания завершения операции используются проверки в цикле. В реальных программах имеет смысл использовать механизм прерываний программы пользователя. Прерывания позволяют отследить окончание передачи (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

На языке МК (на экране ЭКВМ) этот пример будет выглядеть так:
адрескод (HEX)команда
0000011
0001F4РР П 9070
000290 
000370 
0004055
0005F4РР П 9071
000690 
000771 
0008000
0009F4РР П 9072
001090 
001172 
0012000
0013F4РР П 9080
001490 
001580 
0016066
0017033
0018F4РР П 9081
001990 
002081 
0021011
0022F4РР П 9077
002390 
002477 
0025F6РР ИП 9077
002690 
002777 
00285EF x=0 25
002925 
0030000
0031F4РР П 9070
003290 
003370 
003450С/П

Для удобочитаемости программу можно записать в кратком виде.

Программа prim1.mkp (КС 20854/212)

  0 1 2 3 4 5 6 7 8 9
00 1 PP П 90 70 5 PP П 90 71 0 PP П
10 90 72 0 PP П 90 80 6 3 PP П 90
20 81 1 PP П 90 77 PP ИП 90 77 F x=0 25
30 0 PP П 90 70 С/П          

Приём одного байта

Эта программа принимает и выводит байт, передаваемый предыдущей программой.

Программа 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)

  0 1 2 3 4 5 6 7 8 9
00 1 PP П 90 70 5 PP П 90 71 0 PP П
10 90 72 1 6 PP П 90 73 1 PP П 90
20 76 PP ИП 90 76 F x=0 21 0 PP П 90 70
30 0 PP П 90 85 PP ИП 90 86 PP ИП 90 75
40 С/П                  

Файлы примера



Передача и приём нескольких байт, работа с буфером

Передача одного байта и переключение на автоматический приём

Программа передаёт запрос и ожидает ответ. Ответ проверяется, в случае удовлетворения заданному условию выдаётся звуковой сигнал.

Программа 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)

  0 1 2 3 4 5 6 7 8 9
00 1 PP П 90 70 7 PP П 90 71 0 PP П
10 90 72 8 PP П 90 73 0 PP П 90 74
20 1 6 0 PP П 90 78 0 PP П 90 80
30 6 3 PP П 90 81 1 PP П 90 77 PP ИП
40 90 77 F x=0 39 PP ИП 90 76 F x=0 44 PP ИП
50 90 75 F x≠0 76 0 PP П 90 85 PP ИП 90
60 86 3 3 - F x=0 76 2 0 0 0
70 B↑ 2 5 PP П 90 52 0 PP П 90 70
80 PP ИП 90 75 С/П            

Ожидание и выдача ответа

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

Программа 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)

  0 1 2 3 4 5 6 7 8 9
000 1 PP П 90 70 7 PP П 90 71 0 PP П
010 90 72 1 6 PP П 90 73 1 PP П 90
020 76 PP ИП 90 76 F x=0 21 0 PP П 90 85
030 PP ИП 90 86 6 3 - F x=0 45 0 1
040 0 5 PP П 90 26 0 PP П 90 80 K СЧ
050 2 × K [x] F x=0 74 6 3 PP П 90 82
060 3 3 PP П 90 82 0 1 1 9 PP П
070 90 26 БП 91 3 3 PP П 90 82 6
080 3 PP П 90 82 0 1 2 2 PP П 90
090 26 2 PP П 90 77 PP ИП 90 77 F x=0 95
100 0 PP П 90 70 С/П 8Fh E0h A8h ADh EFh
110 E2h 20h 27h 3Fh 27h 20h 2Dh 20h 00h 3Fh
120 21h 00h 21h 3Fh 00h          

Файлы примера



Ожидание и передача пакета, проверка чётности

Ожидание посылки, проверка чётности, подсчёт контрольной суммы

Программа принимает пакет, подсчитывает количество принятых байт и их сумму, одновременно подсчитывается количество ошибок чётности при обмене.

Программа 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)

  0 1 2 3 4 5 6 7 8 9
00 0 П 1 П 2 1 PP П 90 70 9 PP П 90
10 71 1 PP П 90 72 1 6 PP П 90 73
20 1 PP П 90 76 PP ИП 90 76 F x≠0 38 PP ИП
30 90 75 2 0 0 - F x≥0 24 PP ИП 90
40 75 F x≠0 71 П 0 0 PP П 90 85 PP ИП 90
50 86 B↑ ИП 2 + П 2 PP П 90 40 PP ИП
60 90 89 - F x≠0 69 ИП 1 1 + ИП 1 F L0
70 48 ИП 1 ИП 2 PP ИП 90 75 0 PP П 90 70
80 F O С/П                

Генерация пакета

Эта небольшая программа передаёт пакет с установленными битами чётности для предыдущей.

Программа 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)

  0 1 2 3 4 5 6 7 8 9
00 1 PP П 90 70 9 PP П 90 71 1 PP П
10 90 72 0 PP П 90 80 4 0 П 0 1
20 PP П 90 81 1 PP П 90 84 F L0 19 4
30 0 PP П 90 77 PP ИП 90 77 F x=0 34 0
40 PP П 90 70 С/П FFh FFh FFh FFh FFh FFh

Файлы примера



НПП "СЕМИКО" (383) 271-01-25 (многоканальный)