我正在尝试使用 Delphi (BDS2006) 中的 OPOS 驱动程序打开销售点 (POS) 打印机,但不知道如何检查打印机状态。
我将如何检查来自打印机Check Paper
的消息?Paper Jam
我正在尝试使用 Delphi (BDS2006) 中的 OPOS 驱动程序打开销售点 (POS) 打印机,但不知道如何检查打印机状态。
我将如何检查来自打印机Check Paper
的消息?Paper Jam
我没有使用过 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;
您是否从此处使用 ActiveX 控件:http: //monroecs.com/oposccos.htm?它有一个错误状态事件。
首先,您必须为您的设备安装正确的支持软件,您可能必须从制造商的网站下载该软件。请记住,有时,许多设备(如收据打印机)包含标准硬件(例如 EPSON TX-88III),尽管品牌名称可能不同。
支持软件通常包含驱动程序、配置工具以及如何使用驱动程序的可能的编程示例。确保正确完成以下步骤:
驱动安装,配置工具完成
设备使用正确的电缆正确连接(我在找到正确的串行电缆时遇到了问题,因为它们有很多不同的类型)
您的设备被配置软件(通过驱动程序)识别并且通信良好,至少它响应了一些功能
使用随驱动程序安装的 ActiveX 控件。它应该与驱动程序具有相似的名称。
完成上述步骤后,您将在应用程序中拥有一个控件,该控件为您提供所有可用的功能、状态属性和事件(用于纸张或其他任何东西)。