直接向Zebra EPL发送命令

时间:2013-06-06 18:20:01

标签: delphi zebra-printers epl

我正在尝试将命令直接发送到Zebra TLP2844打印机。我按照here提出的建议,我的最终代码如下:

var
  cm: String;
  p: TPrinter;
  i: integer;
begin
  p := Printer;
  p.BeginDoc;    
  for i := 0 to memo1.Lines.Count-2 do
  begin
    cm := memo1.Lines[i];
    if Escape(p.Canvas.Handle,
                PASSTHROUGH,
                Length(cm),
                PAnsiChar(cm),
                nil) = 0 then
      ShowMessage('Command error: ' + IntToStr(GetLastError));
  end;
  p.EndDoc;
end;

memo1的内容是(第一行为空),如目的here

N
q609
Q203,26
B26,26,0,UA0,2,2,152,B,"603679025109"
A253,26,0,3,1,1,N,"SKU 6205518 MFG 6354"
A253,56,0,3,1,1,N,"2XIST TROPICAL BEACH"
A253,86,0,3,1,1,N,"STRIPE SQUARE CUT TRUNK"
A253,116,0,3,1,1,N,"BRICK"
A253,146,0,3,1,1,N,"X-LARGE"
P1,1

打印机似乎没有正确接收或解释命令。我检查了打印机是否处于页面模式(EPL2),使用建议的代码我可以打开打印机手柄。但没有任何印刷品,只有新的标签系列被填满。

我试图将命令完全更改为明显错误的行为并且行为是相同的。

我还应该寻找什么才能打印出来?

2 个答案:

答案 0 :(得分:1)

大多数采用原始命令的打印机都需要包装每个命令的前缀(字符的起始序列)和后缀(字符的结束序列)。我不知道Zebra的前缀和后缀是什么,但文档应该告诉你。

只需添加一对常量来定义前缀和后缀,然后在发送前将它们添加到命令中。

另一个问题可能是您正在从TMemo读取命令的内容,而{1}}在Delphi 2009及更高版本中包含Unicode字符串。然后,您将它们转换为PAnsiChar,这可能会截断内容。通过将cm定义为AnsiString,然后在类型转换之前首先(按原样)分配给Escape函数,提前进行转换。我已经在我的代码中做了这个来说明它。

var
  cm: AnsiString;
  p: TPrinter;
  i: integer;
const
  ZPrefix = AnsiString('$(');     // Replace values for each of these with what
  ZSuffix = AnsiString(')$');     // your documentation says you should use
begin
  p := Printer;
  p.BeginDoc;    
  for i := 0 to memo1.Lines.Count-2 do
  begin
    cm := ZPrefix + memo1.Lines[i] + ZSuffix;
    if Escape(p.Canvas.Handle,
                PASSTHROUGH,
                Length(cm),
                PAnsiChar(cm),
                nil) = 0 then
      ShowMessage('Command error: ' + IntToStr(GetLastError));
  end;
  p.EndDoc;
end;

答案 1 :(得分:0)

我在php中编程,就像C

我可以将内容发送到打印机

我的代码看起来像你的代码唯一的问题我不确定你的编程语言如何处理php中的换行符\ n \ n \ n \ n \ n \ n \ n \ n每行末尾

如果换行不存在则打印作业将无法打印

如果"不发送它不会打印

你的EPL看起来很好,应该打印

斑马网站上有一个下载位置,您可以通过USB电缆将命令发送到连接到计算机的打印机

认为它叫做Zebra Setup Utilities