我正在尝试使用Delphi中的OPOS驱动程序(BDS2006)打开销售点(POS)打印机,但是没有关于如何检查打印机状态的线索。
如何从打印机检查Check Paper
和Paper Jam
等消息?
答案 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),尽管品牌名称可能不同。
支持软件通常包含驱动程序,配置工具以及如何使用驱动程序的编程示例。确保正确完成以下步骤:
安装驱动程序,配置工具
使用正确的电缆正确连接设备(我在查找正确的串行电缆时遇到问题,因为它们有许多不同的类型)
您的设备被配置软件识别(通过驱动程序)并且通信良好,至少它响应某些功能
使用随驱动程序一起安装的ActiveX控件。它应该与驱动程序具有相似的名称。
完成上述步骤后,您将在应用程序中拥有一个控件,为您提供所有可用的功能,状态属性和事件(用于纸张或任何其他)。