热敏打印机从页面中部打印且提前切纸的原因咨询
热敏打印机打印异常:从页面中部开始打印+提前切纸的问题排查与解决
为何热敏打印机执行打印命令时会从页面中部开始打印,且第一份收据尚未打印完成就提前切纸?以下是使用的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),且被提前插入第一份收据内容中,触发提前切纸。 - 字符串未闭合:代码最后一行时间戳字符串缺少闭合引号,引发语法或输出异常。
解决方法
- 转换控制命令为字节:用
chr()函数将十六进制值转为对应ASCII字节:$esc = chr(0x1B); // ESC控制字符 $newLine = chr(0x0A); // 换行字符 - 修正切纸命令:将切纸命令改为字节形式,并移到第一份收据末尾:
$cmds .= chr(0x1D) . chr(0x56) . chr(0x00); // 切纸命令 - 修复字符串闭合问题:给最后一行时间戳添加闭合引号。
修正后的完整代码
//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
相关产品推荐
相关产品推荐

