Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 14.2. Функция Serial Read.






int Serial_Read()

{

// функция возвращает последний записанный

//в программный буфер символ

int ch;

//ждем завершения функции обработки прерывания

while(serial_lock){}

//проверяем, есть ли символы в буфере

if (ser_end! = ser_start)

{

// меняем значение начальной позиции буфера

if (++ser_start > SERIAL_BUFF_SIZE-1) ser_start = 0;

// читаем символ

ch = ser_buffer[ser_start];

// в буфере стало одним символом меньше

if (char_ready > 0) --char_ready;

// возвращаем символ'вызвавшей функции

return(ch);

} // конец действий, если буфер не пуст

else

// буфер был пуст - возвращаем 0

return(0);

} // конец функции

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

Запись в последовательный порт

Нам осталось сделать функцию, которая могла бы записывать символы в последовательный порт. Для выполнения этого достаточно записать данные в регистр поддержки передачи. Однако мы должны сделать так, чтобы одновременно выполнялись два условия:

§ Во-первых, ISR не может быть активен;

§ Во-вторых, регистр поддержки передачи должен быть пуст.

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

Листинг 14.3 содержит программу для передачи символа.

Листинг 14.3. Функция Serial_Write.

Serial_Write(char ch)

{

// эта функция записывает символ в буфер последовательного порта,

// но вначале она ожидает, пока он освободится

// примечание: эта функция не связана с прерываниями

// и запрещает их на время работы

// ждем, освобождения буфера

while(! (_inp(open_port + SER_LSR) & 0х20)){}

// запрещаем прерывания

_asm cli

// записываем символ в порт

_outp(open_port + SER_THR, ch);

// разрешаем прерывания снова

_asm sti

} // конец функции

Обратите внимание на одну хитрость, примененную в функции Serial_Write: она запрещает прерывания перед записью символа в порт и затем вновь разрешает их.

Коммуникационная программа: NLINK

Программа NLINK завершает наш извилистый путь освоения последовательных коммуникаций для ПК. Я написал эту небольшую коммуникационную програм­мку, чтобы вы могли лучше оценить пройденное. Она соединяет два ПК через СОМ1 или COM2 и позволяет двум игрокам общаться по нуль-модемному кабелю. Для выхода из программы надо нажать клавишу Esc. Листинг 14.4 содержит законченную коммуникационную библиотеку и главную часть программы NLINK.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.