我正在尝试在热敏打印机上发送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
3 回答
这里实际上有两个问题:数据传输和传输的数据 .
数据传输:使用usblp
要将数据传输到打印机,请检查是否已加载
usblp
. 它允许您将打印机作为lp
组中的文件公开,以便您可以将其打开为/dev/usb/lp0
.一旦这个工作,作为普通用户,你可以写:
echo "Hello" > /dev/usb/lp0
我写了一个blog post on the topic,其中涵盖了权限方面 .
数据格式
其次,数据本身需要以正确的二进制格式发送 . 打印机不会直接理解这个人类可读的
.prn
(打印?)文件,因此需要将其转换为正确的二进制格式 .要解释您问题中的一些内容:
ESC
表示\x1b
,一个ASCII转义符k
表示``,实际的ASCII字母kCHR$(80)
表示\x50
,这是80号发送到打印机的方式 .CHR$(&H1D);
表示\x1d
,一个ASCII组分隔符(GS
)您可以使用
echo -e
直接在CLI上编写一些基本命令 . 也许最简单的非文本示例是一个说明'000'的CODE39条形码 .这个相同的命令以人类可读的形式,然后十六进制,然后作为终端命令将是:
GS k 4 0 0 0 NUL
1d 6b 04 30 30 30 00
echo -e '\x1d\x6b\x04000\x00' > /dev/usb/lp0
这种格式的最佳参考是您的打印机编程手册,但希望这有助于您解释它 .
请注意,您尝试执行的命令包含错误,其中一个命令甚至会使您陷入页面模式 .
另外,@ scruss和@abartek的答案是完全准确的:检查CUPS是否使用
lsusb
命令声明了端口,并使用十六进制编辑器查看输出,或使用库生成已知良好的命令 .如果热敏打印机通过USB连接,则CUPS很可能会声明该端口 . 因此,您将无法以普通用户身份向其发送数据 .
要通过cups发送原始字节,请使用
lpr -l file
或lp -o raw file
. 要检查要发送的字节,请使用xxd
十六进制查看器 . 这些打印机通常在行尾使用CRLF,因此请务必发送\r\n
.我't have a C library for you, but I'已成功python-escpos
如果您确定十六进制代码,则可以使用您喜欢的十六进制编辑器来生成正确的命令prn文件 . 或者您可以从这里选择一个:Need a good hex editor for Linux
为何选择hex编辑?因为所有其他方式包括一些隐藏内容(如新行0x0d)和打印机无法理解命令顺序 . 可能其他问题是程序用于传递命令 - 某些程序有时会添加其他内容或在将其发送到打印机时进行一些对话(如额外的页面向下) . 确保 - 你的程序不能这样做 .
我这次解决问题的方法:
确定,转义顺序是正确的 . (某些打印机使用特殊的转义序列,来标记 - 下一个比特流将是命令,而不是数据)
请确保,您要发送到打印机的文件是正确的(文件中没有其他代码 - 检查的简便方法是mc viewer - hex mode view(F4))
请确保,交付给打印机的位置是正确的 - 交付程序不会操纵命令文件(使用man来检查) - 比如将不可打印的字符转换为十六进制代码