From: "Eugene A. Misnik" <root@corvet.vernet.lv>
Organization: unknown
> Умные люди!
> Какой бит в байте статуса принтера говорит о переполнении его буфера,
> какой о подтверждении принятии данных?
> Если таковых нет, то как узнать о том, принял он байт или нет?
> Прочитал множество литературы, но везде говориться только об
> ошибках "printer offline" & "no paper".
> С уважением, Дмитрий.
Ув. Дмитрий.
О переполнении буфера можно судить по появлени сигнала "BUSY"
(выв.11 принтера). Правда этот сигнал появляется и в состоянии
сбоя принтера, но приэтом надо еще проверять и состояние вывода
32 принтера "ERROR". Сигнал "ERROR" при переполнении буфера не
появляется.
Перед передачей байта в принтер надо проверить состояние линии "BUSY"
и если все в порядке, то передавать байт.
При чтении состояния принтера проверяются биты:
биты
----
If (b and $B8) = $90 then { all's well }
else begin
If (b and $20) = $20 then { no paper }
If (b and $10) = 0 then { off line }
If (b and $80) = 0 then { busy }
If (b and $08) = $08 then { i/o error}
end;
---
Eugene Misnik (root@corvet.vernet.lv)
{> Cut here. FileName= PRNSTAT.PAS }
{-------------------------------------}
{ Проверка состояния принтера }
{written by Valery Votintsev 2:5021/22}
{usage: prnstat <lptnumber> }
{ where lptnumber = 1 for lpt1 }
{ lptnumber = 2 for lpt2 }
{-------------------------------------}
{ Запустите программу, }
{ включите/выключите принтер, }
{ понажимайте кнопку OnLine... }
{ Когда надоест - ESC }
{-------------------------------------}
uses
crt;
Type
String8 = String[8];
Const
HexD:array[0..15] of Char='0123456789ABCDEF';
var
b,b1,
prnum:byte;
e:integer;
function Byte2Hex(x:Byte):String8;
begin
Byte2Hex:=HexD[(x and $F0) shr 4]+HexD[x and $0F]
end;
function Byte2Bit(b:byte):string8;
var
i,m:byte;
s:string8;
begin
m:=1;
s[0]:=#8;
for i:=8 downto 1 do begin
if (b and m) <> 0 then
s[i]:='1'
else
s[i]:='0';
m:=m shl 1;
end;
byte2bit:=s;
end;
Function PrinterStatus(LptNumber:byte):byte; assembler;
{LptNumber: 1 - lpt1, 2 - lpt2, 3 - lpt3, 4 - lpt4}
{Функция возвращает байт статуса принтера,
в котором установленные биты означают:
Printer Status
7 6 5 4 3 2 1 0
$80 x . . . . . . . Printer not busy (0=busy)
$40 . x . . . . . . Acknowledgement from printer
$20 . . x . . . . . Out of paper
$10 . . . x . . . . Printer selected (0=No printer)
$08 . . . . x . . . I/O error
$04 . . . . . 0 . . Not used (reserved)
$02 . . . . . . 0 . Not used (reserved)
$01 . . . . . . . x Time-out error
}
Asm
mov dl,LptNumber {DX <- номер принтера}
dec dl
xor dh,dh
mov ah,2 {функция 2 - чтение статуса принтера}
int 17h
mov al,ah {AL <- байт состояния принтера}
end;
begin
val(paramstr(1),prnum,e);
if prnum = 0 then Inc(prnum); {по умолчанию LPT=1}
writeln('lpt',prnum,' status:');
b:=PrinterStatus(prnum);
writeln(Byte2Bit(b),'b (',byte2hex(b),'h)');
repeat
b1:=PrinterStatus(prnum);
If b1 <> b then begin {если статус изменился - печатаем его}
writeln(Byte2Bit(b1),'b (',byte2hex(b1),'h)');
b:=b1;
end;
until keypressed;
while keypressed do readkey;
end.
|