我对ESC / POS事情全新,我环顾四周但找不到解决问题的方法。我正在尝试使用通用USB POS-58热敏打印机打印条形码,但打印机上显示的只是条形码数据,而不是条形码本身。我正在使用的代码如下:
$barcode = "12345678901";
$handle = fopen('/dev/usb/lp0', 'w');
if (!$handle) {
echo 'Cannot open printer';
exit(0);
}
fwrite($handle, chr(hexdec('1D')).'f'.chr(0));
fwrite($handle, chr(hexdec('1D')).'H'.chr(2));
fwrite($handle, chr(hexdec('1D')).'h'.chr(60));
fwrite($handle, chr(hexdec('1D')).'w'.chr(2));
fwrite($handle, chr(hexdec('1D')).'k'.chr(1));
fwrite($handle, $barcode.chr(0));
fwrite($handle, chr(hexdec('0A')));
fclose($handle);
请注意我使用的是PHP,但是从命令行(或C)使用printf得到了相同的结果。 我在打印机上得到的是
12345678901
根本没有条形码。打印机是否可能不支持条形码打印? “手册”不是很有用,它只是声明打印机与ESC / POS命令集兼容。我错过了什么吗?
答案 0 :(得分:2)
目前,您正试图解决四个问题:
1)使用ESC / POS以打印机识别的格式编码数据
2)管理对多处理/多用户操作系统上的物理设备的访问
3)使用PHP实现您的系统
4)确定打印机上的命令集支持
通过一次处理一个问题,你将使你的生活变得更加简单。
你确实特别询问打印机是否(不)支持条形码 - 你必须检查手册/联系供应商 - 毕竟你为这件事付了他们的钱,不是吗?
从您的设备命名我认为您正在使用Linux / Unix / BSD。因此,我建议您首先创建静态文件来表示打印作业 - 您可以通过命令行将它们发送到打印机:
cat print_sample_v1.0 >>/dev/usb/lp0
您可能考虑的另一件事是通过来自OpenOffice等应用程序的CUP打印到设备。这将允许您尝试不同的打印机仿真(但如果它是一个特别便宜的设备,那么您将需要使用大型栅格来条码以避免混叠)。
您不应该直接写入打印机端口。在单一任务系统(DOS,CP / M)上这很好,但迟早会遇到问题 - 这就是为什么在过去20年中编写的每个操作系统都有一个打印机假脱机程序。从PHP提交打印作业的最简单方法是生成临时文件和exec lpr。