使用Delphi中的OPOS驱动程序检查打印机消息

时间:2009-04-27 15:57:09

标签: delphi point-of-sale opos

我正在尝试使用Delphi中的OPOS驱动程序(BDS2006)打开销售点(POS)打印机,但是没有关于如何检查打印机状态的线索。

如何从打印机检查Check PaperPaper Jam等消息?

3 个答案:

答案 0 :(得分:6)

我没有使用OPOS驱动程序,但我已经为POS驱动程序做了一些工作,用于连接到现金抽屉的Epson收据打印机。我发现,如果打印机安装在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;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

  1. 安装驱动程序,配置工具

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

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

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

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