You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

热敏打印机从页面中部打印且提前切纸的原因咨询

热敏打印机打印异常:从页面中部开始打印+提前切纸的问题排查与解决

为何热敏打印机执行打印命令时会从页面中部开始打印,且第一份收据尚未打印完成就提前切纸?以下是使用的PHP代码(基于ESC/POS打印方案实现):

//Create ESC/POS commands for sample receipt
$esc = '0x1B'; //ESC byte in hex notation
$newLine = '0x0A'; //LF byte in hex notation

$cmds = '';
$cmds = $esc . "@"; //Initializes the printer (ESC @)

$cmds .= $esc . '!' . '0x38'; //Emphasized + Double-height + Double-width mode selected (ESC ! (8 + 16 + 32)) 56 dec => 38 hex
$cmds .= 'ALGERIE TELECOM'; //text to print
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . '0x00'; //Character font A selected (ESC ! 0)
$cmds .= 'Serial           1234567890';
$cmds .= $newLine;
$cmds .= 'PIN              12345566778';
$cmds .= $newLine . $newLine;
$cmds .= 'Face Value        129080981283';
$cmds .= $newLine;
$cmds .= 'Voucher Type      Broadband';
$cmds .= $newLine;
$cmds .= 'Mobile            Mobile';
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . '0x18'; //Emphasized + Double-height mode selected (ESC ! (16 + 8)) 24 dec => 18 hex
$cmds .= '# ALGERIE TELECOM';
$cmds .= $esc . '!' . '0x00'; //Character font A selected (ESC ! 0)
$cmds .= $newLine . $newLine;
$cmds .= '09/29/22  19:53:17';

$cmds .= $newLine;
$cmds .= '0x1D0x560x00';
$cmds .= $newLine;

$cmds .= $esc . '!' . '0x38'; //Emphasized + Double-height + Double-width mode selected (ESC ! (8 + 16 + 32)) 56 dec => 38 hex
$cmds .= 'ALGERIE TELECOM'; //text to print
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . '0x00'; //Character font A selected (ESC ! 0)
$cmds .= 'Serial            0987654321';
$cmds .= $newLine;
$cmds .= 'PIN               28409328385';
$cmds .= $newLine . $newLine;
$cmds .= 'Face Value        129080981283';
$cmds .= $newLine;
$cmds .= 'Voucher Type      Broadband2';
$cmds .= $newLine;
$cmds .= 'Mobile            Mobile2';
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . '0x18'; //Emphasized + Double-height mode selected (ESC ! (16 + 8)) 24 dec => 18 hex
$cmds .= '# ALGERIE TELECOM';
$cmds .= $esc . '!' . '0x00'; //Character font A selected (ESC ! 0)
$cmds .= $newLine . $newLine;
$cmds .= '09/29/22  19:53:17

问题根源

  • 控制命令未转为实际字节:代码中$esc = '0x1B'、$newLine = '0x0A'是字符串形式的十六进制标识,而非打印机能识别的ASCII控制字节。打印机将这些字符串直接打印,导致初始化、换行等命令失效,打印位置混乱。
  • 切纸命令错误:'0x1D0x560x00'是字符串而非有效的切纸ESC/POS命令(正确为十六进制字节1D 56 00),且被提前插入第一份收据内容中,触发提前切纸。
  • 字符串未闭合:代码最后一行时间戳字符串缺少闭合引号,引发语法或输出异常。

解决方法

  1. 转换控制命令为字节:用chr()函数将十六进制值转为对应ASCII字节:
    $esc = chr(0x1B); // ESC控制字符
    $newLine = chr(0x0A); // 换行字符
    
  2. 修正切纸命令:将切纸命令改为字节形式,并移到第一份收据末尾:
    $cmds .= chr(0x1D) . chr(0x56) . chr(0x00); // 切纸命令
    
  3. 修复字符串闭合问题:给最后一行时间戳添加闭合引号。

修正后的完整代码

//Create ESC/POS commands for sample receipt
$esc = chr(0x1B); //ESC byte
$newLine = chr(0x0A); //LF byte

$cmds = '';
$cmds = $esc . "@"; //Initializes the printer (ESC @)

// 第一份收据内容
$cmds .= $esc . '!' . chr(0x38); //Emphasized + Double-height + Double-width mode
$cmds .= 'ALGERIE TELECOM';
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . chr(0x00); //Character font A selected
$cmds .= 'Serial           1234567890';
$cmds .= $newLine;
$cmds .= 'PIN              12345566778';
$cmds .= $newLine . $newLine;
$cmds .= 'Face Value        129080981283';
$cmds .= $newLine;
$cmds .= 'Voucher Type      Broadband';
$cmds .= $newLine;
$cmds .= 'Mobile            Mobile';
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . chr(0x18); //Emphasized + Double-height mode
$cmds .= '# ALGERIE TELECOM';
$cmds .= $esc . '!' . chr(0x00); //Character font A selected
$cmds .= $newLine . $newLine;
$cmds .= '09/29/22  19:53:17';
$cmds .= $newLine . $newLine;
$cmds .= chr(0x1D) . chr(0x56) . chr(0x00); // 第一份收据切纸

// 第二份收据内容
$cmds .= $esc . '!' . chr(0x38); //Emphasized + Double-height + Double-width mode
$cmds .= 'ALGERIE TELECOM';
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . chr(0x00); //Character font A selected
$cmds .= 'Serial            0987654321';
$cmds .= $newLine;
$cmds .= 'PIN               28409328385';
$cmds .= $newLine . $newLine;
$cmds .= 'Face Value        129080981283';
$cmds .= $newLine;
$cmds .= 'Voucher Type      Broadband2';
$cmds .= $newLine;
$cmds .= 'Mobile            Mobile2';
$cmds .= $newLine . $newLine;
$cmds .= $esc . '!' . chr(0x18); //Emphasized + Double-height mode
$cmds .= '# ALGERIE TELECOM';
$cmds .= $esc . '!' . chr(0x00); //Character font A selected
$cmds .= $newLine . $newLine;
$cmds .= '09/29/22  19:53:17';
$cmds .= $newLine . $newLine;
$cmds .= chr(0x1D) . chr(0x56) . chr(0x00); // 第二份收据切纸

内容的提问来源于stack exchange,提问作者Muhammad Awais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:11:00