JavaScript在ESC/POS页模式下打印超125字符二维码异常问题
ESC/POS页模式打印长二维码卡顿乱码问题(Epson TM-T20X)
我用JavaScript在ESC/POS页模式下给Epson TM-T20X打印机打印二维码,内容少于125字符时正常,超过后打印机卡顿,多次打印测试页还会输出大量乱码。测试用的二维码字符串:aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbbaaaaaaaaaa
原代码如下:
var inAux = QRcode.length + 3; var pL = inAux%256 var pH = inAux/256 var size = 3; impressao += Char(29)+Char(40)+Char(107)+Char(4)+Char(0)+Char(49)+Char(65)+Char(49)+Char(0); // 选择二维码模型(1) impressao += Char(29)+Char(40)+Char(107)+Char(3)+Char(0)+Char(49)+Char(67)+Char(size); // 设置模块大小 impressao += Char(29)+Char(40)+Char(107)+Char(3)+Char(0)+Char(49)+Char(69)+Char(48); // 设置纠错等级(L) impressao += Char(29)+Char(40)+Char(107)+Char(pL)+Char(pH)+Char(49)+Char(80)+Char(48); // 将数据存入符号存储区 impressao += QRcode; impressao += Char(29) + Char(40) + Char(107) + Char(3) + Char(0) + Char(49) + Char(81) + Char(48); // 打印存储区中的符号数据 impressao += esc + Char(12); // 页模式打印(ESC FF)
问题原因与修复方法
- pH值计算错误:当前用普通除法
pH = inAux/256会得到浮点数,但ESC/POS指令要求pH是整数(高8位字节),必须用整数除法取整。浮点数作为指令字节传递给打印机后,会导致指令解析失败,触发卡顿和乱码。 - 可选优化:页模式初始化:页模式下打印前建议先执行初始化指令,避免之前的缓存残留影响当前打印任务。
修复后的关键代码:
var inAux = QRcode.length + 3; var pL = inAux % 256; var pH = Math.floor(inAux / 256); // 改用整数除法取整,确保得到高8位的整数字节值 var size = 3; // 打印前添加页模式初始化 impressao += Char(27) + Char(76); // ESC L:进入页模式 // 后续二维码配置与打印指令保持不变 impressao += Char(29)+Char(40)+Char(107)+Char(4)+Char(0)+Char(49)+Char(65)+Char(49)+Char(0); impressao += Char(29)+Char(40)+Char(107)+Char(3)+Char(0)+Char(49)+Char(67)+Char(size); impressao += Char(29)+Char(40)+Char(107)+Char(3)+Char(0)+Char(49)+Char(69)+Char(48); impressao += Char(29)+Char(40)+Char(107)+Char(pL)+Char(pH)+Char(49)+Char(80)+Char(48); impressao += QRcode; impressao += Char(29) + Char(40) + Char(107) + Char(3) + Char(0) + Char(49) + Char(81) + Char(48); impressao += esc + Char(12);
额外注意:如果二维码内容包含非ASCII字符,要先将字符串转成正确的字节流(比如UTF-8)后再计算长度,避免因字符编码导致的长度计算偏差。
内容的提问来源于stack exchange,提问作者julia marçal
相关产品推荐
相关产品推荐

