如何使用ReadPrinter?

时间:2019-04-22 17:54:05

标签: delphi

我将打印件直接发送到线轴,如下所示:

var
 cmnd : TBytes;
 ...   
 WritePrinter(HandleImp, @cmnd[0], Length(cmnd), CaracteresImpressos);
 ...

在大多数情况下,这满足了我的需求,我的问题是关于需要打印机响应的命令,例如读取状态。

我了解了函数ReadPrinter (),但我无法使用它……返回值始终不同于0(根据表明函数已执行的文档),但是缓冲区为空,因为如果打印机没有响应。

“ ci”的返回值等于0。

https://docs.microsoft.com/en-us/windows/desktop/printdocs/readprinter

这是我的代码:

function TTP650.pedeStatusDrawer: TBytes;
    begin
      SetLength(result, 3);
      result[0] := 16;
      result[1] := 04;
      result[2] := 01;
    end;

function TForm1.statusDrawer: boolean;
    var
      buffer : TBytes;
      cmnd : TBytes;
      s : string;
      i : integer;
      ret : boolean;
      ci: DWORD;
    begin
      setLength(buffer,20);
      DescricaoAnsiString := 'Lendo Pulso/Gaveta' + #10;
      cmnd := tp.pedeStatusDrawer();

      if not OpenPrinter(PChar(driverselecionado), HandleImp, nil) then
        Memo1.Lines.Add('Erro: Impressora não encontrada')
      else
      begin

      Documento.pDocName := PChar('Minha impressão');
      Documento.pOutputFile := nil;
      Documento.pDataType := 'RAW';

      StartDocPrinter(HandleImp, 1, @Documento);
      StartPagePrinter(HandleImp);

      WritePrinter(HandleImp, @cmnd[0], Length(cmnd), CaracteresImpressos);
      ret := ReadPrinter(HandleImp, @buffer[0], Length(buffer), ci);

      EndPagePrinter(HandleImp);
      EndDocPrinter(HandleImp);

      if(ret = true) then
      begin
          if(ci >0) then
          begin
            for i := 0 to Length(buffer)-1 do
            s := s + IntToStr(buffer[i]) + ' ';

            Memo1.Lines.Add(s);
          end;

      end;
      ClosePrinter(HandleImp);
      end;

    end;

我正在使用双向热敏打印机。 文档摘录:

[Name] Real-time status transmission 

[Format] ASCII   DLE  EOT n 

          Hex     10  04  n 

          Decimal 16  4   n

[Description]

根据以下参数实时传输n指定的选定打印机状态:

n = 1: Transmit printer status 

n = 2: Transmit offline status 

n = 3: Transmit error status 

n = 4: Transmit paper roll sensor status

如果有兴趣,请阅读完整的文档(第9页和第10页讨论该主题)。 printer documentation

1 个答案:

答案 0 :(得分:0)

我有使用串行通讯的答案。 我通过串口发出了我在问题中提到的字符串的发送命令,并读取:

Serial: TBlockSerial;
b: = Serial.RecvByte (500);

有效。

相关问题