1

我正在尝试使用 Delphi (BDS2006) 中的 OPOS 驱动程序打开销售点 (POS) 打印机,但不知道如何检查打印机状态。

我将如何检查来自打印机Check Paper的消息?Paper Jam

4

3 回答 3

6

我没有使用过 OPOS 驱动程序,但我已经使用 POS 驱动程序为连接到现金抽屉的爱普生收据打印机做了一些工作。我发现,如果打印机安装在 Windows 中,您可以直接打开到它的连接并让它做任何您想做的事情。

打印机这么慢的原因是它使用了 Windows 的图形字体功能。当您直接打开打印机时,您会将模式设置为 RAW,它只会像老式点阵一样发送文本。要打开钱箱,您只需将特定的控制代码发送给它,就好像您要打印它们一样。打印机在打印之前拦截代码并将抽屉打开。

顺便说一句,我不知道这将如何与 Unicode 一起使用。我只真正使用过 ASCII 数据的打印机。可能会有为国际市场设计的变体,它们的工作方式会有所不同。

这是我用来使它工作的代码(VxMsgBox 只是 MessageBox 的一个封面):

{***************************************************************************}
{**             PrintDirect2Printer                                       **}
{***************************************************************************}
procedure PrintDirect2Printer(PrinterName, Data:pchar; dwByteCount:DWORD);
var PrinterHandle  : THandle;
    DocInfo        : TDocInfo1;
    dwJob          : DWORD;
    dwBytesWritten : DWORD;
begin
if not OpenPrinter(PrinterName, PrinterHandle, nil) then exit; //failed to open printer, abort
DocInfo.pDocName    := 'Direct 2 Printer';
DocInfo.pOutputFile := nil;
DocInfo.pDataType   := 'RAW';
dwJob:=StartDocPrinter(PrinterHandle, 1, @DocInfo);
if dwJob=0 then //failed to start a document
   begin
   ClosePrinter(PrinterHandle);
   exit;
   end;
if not StartPagePrinter(PrinterHandle) then
   begin
   EndDocPrinter(PrinterHandle);
   ClosePrinter(PrinterHandle);
   exit;
   end;
if not WritePrinter(PrinterHandle, Data, dwByteCount, dwBytesWritten) then
   begin
   EndPagePrinter(PrinterHandle);
   EndDocPrinter(PrinterHandle);
   ClosePrinter(PrinterHandle);
   exit;
   end;
if not EndPagePrinter(PrinterHandle) then
   begin
   EndDocPrinter(PrinterHandle);
   ClosePrinter(PrinterHandle);
   exit;
   end;
if not EndDocPrinter(PrinterHandle) then
   begin
   ClosePrinter(PrinterHandle);
   exit;
   end;
ClosePrinter(PrinterHandle);
if dwBytesWritten<>dwByteCount then
   VxMsgBox('Print Direct To Printer failed.', 'Printer Error', mb_Ok);
end;

{***************************************************************************}
{**             OpenPrintDirect2Printer                                   **}
{***************************************************************************}
function OpenPrintDirect2Printer(PrinterName, DocName:pchar; var PrinterHandle:THandle):boolean;
var DocInfo        : TDocInfo1;
    dwJob          : DWORD;
begin
result:=false;
if not OpenPrinter(PrinterName, PrinterHandle, nil) then exit; //failed to open printer, abort
DocInfo.pDocName    := DocName;
DocInfo.pOutputFile := nil;
DocInfo.pDataType   := 'RAW';
dwJob:=StartDocPrinter(PrinterHandle, 1, @DocInfo);
if dwJob=0 then //failed to start a document
   begin
   ClosePrinter(PrinterHandle);
   exit;
   end;
if not StartPagePrinter(PrinterHandle) then
   begin
   EndDocPrinter(PrinterHandle);
   ClosePrinter(PrinterHandle);
   exit;
   end;
result:=true;
end;

{***************************************************************************}
{**             WritePrintDirect2Printer                                  **}
{***************************************************************************}
function WritePrintDirect2Printer(PrinterHandle:THandle; Data:pchar; dwByteCount:DWORD):boolean;
var dwBytesWritten : DWORD;
begin
result:=true;
if not WritePrinter(PrinterHandle, Data, dwByteCount, dwBytesWritten) then
   result:=false;
if dwBytesWritten<>dwByteCount then
   VxMsgBox('WritePrintDirect2Printer byte check failed.', 'Printer Error', mb_Ok);
end;


{***************************************************************************}
{**             ClosePrintDirect2Printer                                  **}
{***************************************************************************}
procedure ClosePrintDirect2Printer(var PrinterHandle:THandle);
begin
if not EndPagePrinter(PrinterHandle) then
   begin
   EndDocPrinter(PrinterHandle);
   ClosePrinter(PrinterHandle);
   PrinterHandle:=0;
   exit;
   end;
if not EndDocPrinter(PrinterHandle) then
   begin
   ClosePrinter(PrinterHandle);
   PrinterHandle:=0;
   exit;
   end;
ClosePrinter(PrinterHandle);
PrinterHandle:=0;
end;
于 2009-04-27T17:42:55.630 回答
0

您是否从此处使用 ActiveX 控件:http: //monroecs.com/oposccos.htm?它有一个错误状态事件。

于 2009-04-27T18:09:04.850 回答
0

首先,您必须为您的设备安装正确的支持软件,您可能必须从制造商的网站下载该软件。请记住,有时,许多设备(如收据打印机)包含标准硬件(例如 EPSON TX-88III),尽管品牌名称可能不同。

支持软件通常包含驱动程序、配置工具以及如何使用驱动程序的可能的编程示例。确保正确完成以下步骤:

  1. 驱动安装,配置工具完成

  2. 设备使用正确的电缆正确连接(我在找到正确的串行电缆时遇到了问题,因为它们有很多不同的类型)

  3. 您的设备被配置软件(通过驱动程序)识别并且通信良好,至少它响应了一些功能

  4. 使用随驱动程序安装的 ActiveX 控件。它应该与驱动程序具有相似的名称。

完成上述步骤后,您将在应用程序中拥有一个控件,该控件为您提供所有可用的功能、状态属性和事件(用于纸张或其他任何东西)。

于 2009-04-29T17:11:41.537 回答