Linux下如何向热敏打印机发送ESC/POS命令



我正在尝试在热敏打印机上发送ESC/POS命令。但是每当我发送它们时,热敏打印机都会将它们打印为文本而不是作为命令执行。我在一个。prn文件中编写这些命令,每当我执行lp命令打印文件时,这些。prn文件也会被打印,但作为文本。

我尝试了以下方法在。prn文件中编写ESC/POS命令:

1) PRINT #1, CHR$(&H1D);"h";CHR$(80);
   PRINT #1, CHR$(&H1D);"k";CHR$(2);
   PRINT #1, "48508007";CHR$(0);
   PRINT #1, CHR$(&HA);
   PRINT #1, CHR$(&H1D);"k";CHR$(67);CHR$(12);
   PRINT #1, "48508007";
2) <ESC>(0x1B) <L>(0x4C)
   <GS>(0x1D) <k>(0x6B) 73 2 4 5 6 7 8 9 NUL
   <FF>(0x0c)
3) <ESC L>
   <GS k 73 2 4 5 6 7 8 9 NUL>

4)"ESC L"GS k 73 2 4 5 6 7 8 9 NUL"FF"我还尝试使用C程序发送ESC/POS命令:

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
int main() {
   int fd,ret;
   char buf[] = "HELLO"
   fd = open("/dev/bus/usb/003/007",O_WRONLY);
   if(fd < 3) {
      perror(open failed);
   }
   ret = write(fd,&buf,sizeof(buf));
   if(ret == -1) {
      perror("write failed");
   }
}

执行时,上面的代码给出如下错误:

write failed: invalid arguments

这里实际上有两个问题:数据传输和被传输的数据。

数据传输:使用usblp

为了将数据发送到打印机,检查usblp是否已加载。它允许您将打印机作为lp组中的文件公开,以便您可以将其作为/dev/usb/lp0打开。

一旦生效,作为普通用户,您可以这样写:

echo "Hello" > /dev/usb/lp0

我写了一篇关于这个主题的博客文章,涵盖了权限方面。

<标题> 数据格式

其次,数据本身需要以正确的二进制格式发送。打印机无法直接理解这个人类可读的.prn (print?)文件,因此需要将其转换为正确的二进制格式。

从你的问题中解释一些事情:

  • ESC表示x1b,一个ASCII转义
  • k表示' ',实际ASCII字母k
  • CHR$(80)表示x50,这是将数字80发送到打印机的方式。
  • CHR$(&H1D);表示x1d, ASCII组分隔符(GS)

您可以使用echo -e直接在CLI上编写一些基本命令。也许最简单的非文本示例是一个CODE39条形码,上面写着'000'。

这个相同的命令以人类可读的形式出现,然后十六进制,然后作为终端命令:

  • GS k 4 0 0 0 NUL
  • 1d 6b 04 30 30 30 00
  • echo -e 'x1dx6bx04000x00' > /dev/usb/lp0

对于这种格式,您最好的参考资料是打印机的编程手册,但希望它能帮助您理解它。

请注意,您尝试执行的命令包含错误,其中一个甚至会使您陷入页面模式。

除此之外,@scruss和@abartek的答案是完全准确的:使用lsusb命令检查CUPS没有声明端口,并使用十六进制编辑器检查您的输出,或者使用库生成已知的命令。

如果热敏打印机是通过USB连接的,CUPS很有可能已经声明了端口。因此,您将无法以普通用户的身份向它发送数据。

通过cups发送原始字节,使用lpr -l filelp -o raw file。要检查将要发送的字节,请使用xxd十六进制查看器。这些打印机通常在行尾接收CRLF,所以一定要发送rn

我没有C库给你,但我已经成功地使用了python-escpos

如果您确定十六进制代码,您可以使用您最喜欢的十六进制编辑器来制作正确的命令prn文件。或者您可以从这里选择一个:需要一个好的Linux十六进制编辑器
为什么使用十六进制编辑器?因为所有其他方式包括一些隐藏的内容(如新行0x0d)和打印机无法理解命令顺序。可能另一个问题是你用来传递命令的程序——一些程序有时会在发送给打印机时添加其他内容或进行一些对话(比如额外的下一页)。请确定-您的程序不能这样做。
我这次解决问题的方法:

  • 确保转义顺序是正确的。(有些打印机使用特殊的转义序列,来标记-下一个比特流将是命令,而不是数据)
  • 请确定,您想发送到打印机的文件是正确的(文件中没有额外的代码-检查的简单方法是mc查看器-十六进制模式视图(F4))
  • 要确定,传递到打印机是位正确的-传递程序不操纵命令文件(使用man检查它)-如将不可打印字符转换为十六进制代码

相关内容

  • 没有找到相关文章

最新更新