Реклама:

//Маски состояния

статических сигналов:

♦define

CTS

0x10

//Состояние линии СТБ

♦define

DSR

0x20

//Состояние линии

♦define

Rl

0x40

//Состояние линии Р1

♦define

DCD

0x80

//Состояние линии ОСО

//Определение функций:

void init_ser(void);

int out_sym(int symbol);

int in_sym(int *symbol, timeout, *error_code);

//Конец файла SERIAL.H

Функция инициализации последовательного порта init_ser() в данном примере не требует параметров, поскольку (так чаще всего и бывает) заранее известен режим работы микросхемы.

Функция передачи байта out_sym() в случае успешного завершения возвращает 0, в противном случае — 1.

Функция приема байта in_sym() в случае успешного приема возвращает 0, в случае же неуспеха — код ошибки равный 1, — если в течение ожидаемого времени данные не были приняты, 2 если байт данных был принят с ошибкой (байт состояния в этом случае присваивается переменной error_code).

Инициализируем последовательный порт для работы со скоростью 9600 бит/с, по опросу (все прерывания запрещены), статические сигналы управления не используются (применена трехпроводная линия связи), длина посылки 8 бит, стоповых битов 2, контроля четности нет. Следует обратить внимание на то, чтобы переменной BASE было присвоено верное значение ДО вызова любой из описанных выше функций.

void init_ser(void) {

//Подготовка к записи делителя скорости передачи: outportb(CONTROL, DIVISOR); //Запись младшего и старшего байт делителя: outportb(LOW_DIV, В_9600); outportb(HIGH_DIV, В_9600 » 8); //Запись управляющего слова, соответствующего выбранному //режиму:

outportb(CONTROL, BIT_8+STOP_2+NOPARITY); //Запрет прерываний: outportb(INT_REG, 0); }

Теперь приведем текст функции передачи байта:

int out_sym(int symbol) { long timeout; timeout=clock();

//Ожидаем окончания передачи предыдущего байта, //следя за временем передачи: do {

if((clöck() - timeout) == 3) return -1; //Время истекло } while((inportb(STATUS) & DATA_OUT) == 0); //Предыдущий байт передан успешно, передаем дальше: outportb(OUT_REG, symbol); return 0; }

Функция clock(), описанная в файле TIME.H, возвращает значение системной переменной, которая увеличивается на 1 каждые 55 мс (по прерываниям от системного таймера). Таким образом, возврат по условию ((clock()-timeout) == 3) означает невозможность передать предыдущий символ за время, большее ПО мс, что с избытком превосходит время, необходимое для передачи байта даже при работе на скорости ПО бит/с. Такая ситуация может возникнуть если, например, отвалился провод, по которому на микросхему УАПП поступает тактовая частота, или она (микросхема) сгорела на работе да так, что бит DATA_OUT постоянно находится в состоянии 0.

Немногим сложнее выглядит функция приема байта: int in_sym(int *symbol, timeout, *error_code) { long tmp;

tmp=clock();

//Ожидаем приема байта, следя за временем: do {

if((clock() - tmp) >= timeout) return 1; //Время истекло

*error_code=inportb(STATUS);

} while ((*error_code & DATAJN) == 0);

//Может, была ошибка при приеме ?

if((*error_code & (FRAME_ERR+OVERRUN)) != 0) {


⇐ Предыдущая страница| |Следующая страница ⇒