gpt4 book ai didi

delphi - Zebra 打印机直接通信

转载 作者:行者123 更新时间:2023-12-03 15:32:51 26 4
gpt4 key购买 nike

基于this question我已经实现了以下代码来将直接命令发送到我的 Zebra TLP2844

var
cmm: AnsiString;
i: integer;
begin
commands.saveToFile('path\to\a\file');
Printer.BeginDoc;
cmm := '';
for i := 0 to commands.Count-1 do
cmm := cmm + commands[i] + #10;
Escape(Printer.Canvas.Handle, PASSTHROUGH, Length(cmm), PAnsiChar(cmm), nil);
Printer.EndDoc;
end;

commands 是一个 TSringList,其中包含我要发送到打印机的所有命令。请注意,我将所有命令保存到一个文本文件中。

好吧,如果我通过驱动程序首选项发送此文本文件进行打印,使用工具 -> 操作 -> 发送文件,它会完美打印。

如果我使用上面的代码,它会在打印后吐出一些额外的标签行。

显然,它表明我在这里做错了什么,但我不知道是什么。

我尝试过的

  • 一条一条地发送命令,而不是像代码中那样将它们连接起来。 结果:没有打印任何内容。
  • 将 #10 更改为 #13#10。 结果:同样的疯狂行为(事实上,Zebra EPL 文档表示它将忽略它找到的任何 #13)

我还应该尝试什么才能以与 Zebra 工具完全相同的方式向打印机发送命令?

最佳答案

据我所知,您需要按照 ExtEscape() API 布局的预期格式化缓冲区。我从未使用过 Escape(),但使用过 ExtEscape() - 并且它可以与 Zebra 打印机配合使用。

这里是what the MSDN doc states :

lpszInData [in] A pointer to the input structure required for the specified escape. The first word in the buffer contains the number of bytes of input data. The remaining bytes of the buffer contain the data itself.

所以你可以这样编码:

  cmm := '00'; // reserve space for the initial `word`
for i := 0 to commands.Count-1 do
cmm := cmm + commands[i] + #10;
pword(cmm)^ := length(cmm)-2; // store the length
if ExtEscape(Printer.Canvas.Handle, PASSTHROUGH, Length(cmm), pointer(cmm), 0, nil)<0 then
raise Exception.Create('Error at printing to printer');
Printer.EndDoc;

请注意,如果您的命令格式不正确(例如缺少字符),它可能只会在打印机后台处理程序中产生内存不足错误 - 是的,我已经看到了!在这种情况下,您可能必须终止然后重新启动 Printer Spooler 服务...修复您的代码...然后重试...

并且不要忘记按照 Zebra 文档的要求将 ESC 字符放在每个 commands[] 的开头。

关于delphi - Zebra 打印机直接通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18605078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com