You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 10.2下如何给USB/蓝牙Xprinter XP-58H发送指令打开POS钱箱

解决USB/蓝牙连接的Xprinter XP-58H打开钱箱问题

针对你的情况,以下几种可行方法可以尝试:

方法1:用WinAPI直接向打印设备发送二进制指令

AssignPrn会把输出当作文本处理,可能无法正确传递ESC/POS控制指令。改用WinAPI的打印函数直接发送二进制指令,示例代码如下:

uses
  Winapi.Windows, Winapi.Printers;

procedure SendEscPosToPrinter(const PrinterName: string; const Data: TBytes);
var
  hPrinter: THandle;
  DocInfo: TDocInfoA;
  BytesWritten: DWORD;
begin
  if not OpenPrinter(PChar(PrinterName), hPrinter, nil) then Exit;
  try
    ZeroMemory(@DocInfo, SizeOf(DocInfo));
    DocInfo.cbSize := SizeOf(DocInfo);
    DocInfo.pDocName := 'Open Cash Drawer';
    if StartDocPrinter(hPrinter, 1, @DocInfo) > 0 then
    begin
      if StartPagePrinter(hPrinter) then
      begin
        WritePrinter(hPrinter, @Data[0], Length(Data), BytesWritten);
        EndPagePrinter(hPrinter);
      end;
      EndDocPrinter(hPrinter);
    end;
  finally
    ClosePrinter(hPrinter);
  end;
end;

// 调用示例
procedure TForm1.ButtonOpenDrawerClick(Sender: TObject);
var
  Cmd: TBytes;
begin
  // XP-58H的钱箱指令,部分型号需将第二个参数改为#1
  Cmd := TEncoding.ASCII.GetBytes(#27#112#0#150#250);
  SendEscPosToPrinter(Printer.Printers[Printer.PrinterIndex], Cmd);
end;

方法2:调整ESC/POS指令参数

部分Xprinter型号的钱箱触发指令参数有差异,你可以尝试替换指令为:
#27#112#1#150#250(将第三个字符从#0改为#1),这个参数对应触发钱箱的第二个驱动。

方法3:使用厂商官方SDK

Xprinter提供了专属开发SDK,里面包含现成的钱箱控制接口,直接调用SDK函数可以避免指令兼容性问题,你可以去厂商官网下载对应版本的SDK集成到Delphi项目中。

内容的提问来源于stack exchange,提问作者XBasic3000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:12:40