Deno中ESC/POS打印机位图指令被打印为文本的问题求助
解决Deno发送ESC/POS位图指令被识别为文本的问题
问题根源:你当前的ticket.txt文件中,ESC/POS控制指令(比如ESC字符)是以文本转义形式(如\ESC或^[)存储的,Deno读取后发送的是这些转义字符的ASCII字节,而非打印机需要的原始二进制控制字节(比如ESC对应的十六进制0x1B),因此打印机将所有内容当成普通文本打印。
解决方案
方案1:在代码中直接构建二进制指令序列
直接在代码里用Uint8Array定义包含控制字节和位图数据的二进制数组,避免文本转义的问题。示例代码如下:
// 连接打印机 const connection = await Deno.connect({ transport: 'tcp', hostname: '<PRINTER IP>', port: 9100 }); // 构建ESC/POS位图指令的二进制数据 // 替换为你实际需要的指令参数和位图数据(参考爱普生ESC/POS文档) const escPosData = new Uint8Array([ 0x1B, 0x2A, // ESC * 指令前缀 0x01, // m参数,指定位图打印模式 0x00, 0x10, // n1 n2,位图宽度(示例为16列,根据实际调整) // 此处添加你的位图原始数据字节... ]); // 发送二进制数据 await connection.write(escPosData); // 关闭连接 connection.close();
方案2:将指令保存为二进制文件而非文本文件
如果需要用文件存储指令,不要用.txt文本格式,而是将控制字符转换为原始二进制字节后保存为二进制文件(比如ticket.bin):
- 把
ticket.txt中的文本转义字符(如\ESC)替换为对应的十六进制字节(比如0x1B)。 - 通过编程工具或二进制编辑器,将处理后的内容保存为二进制文件。
- 修改代码读取该二进制文件发送(逻辑和你当前代码一致,仅替换文件路径):
const connection = await Deno.connect({ transport: 'tcp', hostname: '<PRINTER IP>', port: 9100 }); const file = await Deno.readFile('./ticket.bin'); // 读取二进制指令文件 await connection.write(file); connection.close();
额外注意事项
- 确保位图数据的格式符合打印机要求(比如字节顺序、宽度对齐规则,参考对应ESC/POS文档)。
- 部分打印机需要在指令末尾添加换行或切纸指令(如
0x0A或0x1B, 0x69),保证输出流程完成。
内容的提问来源于stack exchange,提问作者Mqx
相关产品推荐
相关产品推荐

