![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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.
|