use*_*949 7 linux printing thermal-printer escpos
我正在尝试在热敏打印机上发送 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>
Run Code Online (Sandbox Code Playgroud)
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");
}
}
Run Code Online (Sandbox Code Playgroud)
执行后,上面的代码给出错误为:
write failed: invalid arguments
Run Code Online (Sandbox Code Playgroud)
这里实际上有两个问题:数据传输和正在传输的数据。
usblp要将数据发送到打印机,请检查是否usblp已加载。它允许您将打印机作为lp组中的文件公开,以便您可以将其打开为/dev/usb/lp0.
一旦成功,作为普通用户,您可以编写:
echo "Hello" > /dev/usb/lp0
其次,数据本身需要以正确的二进制格式发送。打印机不会直接理解这个人类可读.prn(打印?)文件,因此需要将其转换为正确的二进制格式。
从你的问题中解释一些事情:
ESC意思是\x1b,一个 ASCII 转义符k 意思是``,实际的ASCII字母kCHR$(80)表示\x50,这是将数字 80 发送到打印机的方式。CHR$(&H1D);表示\x1dASCII 组分隔符 ( GS)您可以直接在 CLI 上使用echo -e. 也许最简单的非文本示例是 CODE39 条形码,上面写着“000”。
人类可读形式的相同命令,然后是十六进制,然后作为终端命令将是:
GS k 4 0 0 0 NUL1d 6b 04 30 30 30 00echo -e '\x1d\x6b\x04000\x00' > /dev/usb/lp0这种格式的最佳参考是打印机的编程手册,但希望这有助于您理解它。
请注意,您尝试执行的命令包含错误,其中之一甚至会使您陷入页面模式。
此外,@scruss 和@abartek 的答案是完全准确的:使用lsusb命令检查 CUPS 是否未声明端口,并使用十六进制编辑器查看您的输出,或使用库生成已知良好的命令。
小智 0
如果您确定十六进制代码,您可以使用您最喜欢的十六进制编辑器来制作正确的命令 prn 文件。或者您可以从这里选择一个:Need a good hex editor for Linux
为什么选择十六进制编辑器?因为所有其他方式包括一些隐藏内容(如换行 0x0d)并且打印机无法理解命令序列。可能其他问题是您用来传递命令的程序 - 某些程序有时会添加其他内容或在将其发送到打印机时进行一些对话(例如额外的向下翻页)。请确保 - 您的程序无法执行此操作。
我这次解决问题的方式: