Запись в последовательный порт
Нам осталось сделать функцию, которая могла бы записывать символы в последовательный порт. Для выполнения этого достаточно записать данные в регистр поддержки передачи. Однако мы должны сделать так, чтобы одновременно выполнялись два условия:
§
Во-первых, 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:
она запрещает прерывания перед записью символа в порт и затем вновь разрешает их.