LINUX.ORG.RU

вопросы про com port и lpt


0

0

как определить в программе на языке Си, что записанные в ком. порт (в буффер ком порта) данные выданы полностью.
И еще один вопрос есть ли какие нибудь стандартные команды для определения статуса принтера через порт lpt (включен, есть ли бумага) или для каждого принтера свои команды.


По поводу сом-порта, на примере сом1 (базовый адрес 0x3f8):

если (содержимое регистра 0x3fd) & 0x60 == 0x60 , то все данные переданы.

бит 0x40 == 1 -- сдвиговый регистр передатчика пуст (т.е. ничего в данный момент микросхемой не передается)

бит 0x20 == 1 -- регистр хранения символа передатчика пуст (т.е. ничего в даннный момент нет в буфере микросхемы)

Это все естественно не учитывает буферы ядра и операционной системы

ansky ★★★★★
()

как определить в программе на языке Си, что записанные в ком. порт (в буффер ком порта) данные выданы полностью.

На уровне интерфейсов ОС -- вполне возможно, что и никак. В том смысле, что не факт, что вызов tcflush(), например, завершается ПОСЛЕ того как все данные будут переданы, а не записаны, например, в FIFO буфер приёмопередатчика. Я не уверен. Но точно сказать не берусь.

На уровне интерфейса микросхемы 16550A и аналогов -- проверкой соответствующего битика.

ОСОБЕННО ХОЧЕТСЯ ВЫДЕЛИТЬ: НЕВОЗМОЖНО УЗНАТЬ ДОСТАТОЧНО ТОЧНО УЗНАТЬ КОГДА ИМЕННО УШЁЛ ПОСЛЕДНИЙ БАЙТ НА УРОВНЕ ИНТЕРФЕЙСОВ ОС. Если интересует именно это -- ничего кроме кривого решения здесь получить нельзя.

> И еще один вопрос есть ли какие нибудь стандартные команды для определения статуса принтера через порт lpt (включен, есть ли бумага) или для каждого принтера свои команды.

Команды конечно свои. А параллельный интерфейс centronics -- один на всех. google://centronics.

fk0
()

man tcdrain()

обычно хватает на все случаи жизни

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.