1

我对 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 命令集兼容。我错过了什么吗?

4

1 回答 1

2

目前您正在尝试解决四个问题:

1) 使用 ESC/POS 以打印机可以识别的格式对数据进行编码

2) 在多处理/多用户操作系统上管理对物理设备的访问

3) 使用 PHP 实现您的系统

4) 确定打印机上的命令集支持

一次只处理一个问题会让你的生活变得更简单。

您确实特别询问了打印机是否(不)支持条形码-您必须检查手册/联系供应商-毕竟您为这件事付了很多钱,不是吗?

从您的设备命名中,我猜到您正在使用 Linux/Unix/BSD。因此,我建议您首先创建静态文件来表示打印作业 - 您可以从命令行将它们发送到打印机,只需:

 cat print_sample_v1.0 >>/dev/usb/lp0

您可能会考虑的另一件事是通过 CUP 从 OpenOffice 等应用程序打印到设备。这将允许您尝试不同的打印机仿真(但如果它是一个特别便宜的设备,那么您需要为条形码使用大光栅以避免混叠)。

您不应该直接写入打印机端口。在单任务系统(DOS、CP/M)上这很好,但迟早你会遇到问题——这就是为什么过去 20 年编写的每个操作系统都有一个打印机假脱机守护进程。从 PHP 提交打印作业的最简单方法是生成一个临时文件并在其上执行 lpr。

于 2013-12-30T12:19:37.070 回答