Flutter蓝牙连接Xprinter 365B热敏打印机发送数据无法打印
问题根因
你目前测试过的所有pub.dev蓝牙打印库(esc_pos_printer、print_bluetooth_thermal默认逻辑、printing)均基于ESC/POS小票指令集实现打印,而你的Xprinter 365B设备当前默认工作在TSC标签指令模式,无法解析ESC/POS格式指令,才会出现蓝牙连接正常、数据发送无报错但打印机完全无响应的现象——数据确实传到了打印机,但指令格式不匹配,打印机不会执行任何动作。
你之前判断的方向完全正确:只要让打印机和代码侧使用的指令集匹配,问题就能解决,不需要更换硬件或者换连接方案。
可落地解决方案
二选一即可,根据自己的打印场景选:
方案1:代码指令切换打印机到ESC/POS小票模式(适用于小票打印场景)
Xprinter全系列热敏打印机支持通过蓝牙透传指令切换工作模式,不需要依赖官方APP手动设置,在蓝牙连接成功后、发送打印数据前,先发送模式切换指令即可:
- 通用TSC模式切ESC/POS小票模式指令字节:
[0x1D, 0x49, 0x61, 0x00] - 部分早期批次365B的切换指令为:
[0x1B, 0x69, 0x01]
发送指令后等待500ms让打印机完成模式切换,再发送你之前生成的ESC/POS打印数据即可正常出纸。
额外注意:你现有代码里Generator初始化用的是PaperSize.mm58,和你80mm的打印机规格不匹配,要改成PaperSize.mm80,否则打印内容会出现排版错位、边距异常的问题。
方案2:直接使用TSC指令打印(适用于标签打印场景)
如果你的业务场景是打印标签不需要切换到小票模式,就不要用esc_pos库的Generator生成打印字节,直接按照TSC指令规范拼接打印内容,通过蓝牙透传发送即可,基础打印示例代码:
Future<void> printTscLabel() async { List<int> printBytes = []; // 初始化标签参数:宽80mm 高40mm,标签间隙2mm printBytes += 'SIZE 80 mm,40 mm\r\n'.codeUnits; printBytes += 'GAP 2 mm,0 mm\r\n'.codeUnits; printBytes += 'CLS\r\n'.codeUnits; // 打印文本:坐标(20,20)位置,3号字体,无旋转,宽高放大2倍,内容为测试文本 printBytes += 'TEXT 20,20,"3",0,2,2,"Xprinter TSC模式测试"\r\n'.codeUnits; // 打印1份 printBytes += 'PRINT 1,1\r\n'.codeUnits; // 调用蓝牙透传接口发送数据 await PrintBluetoothThermal.writeBytes(printBytes); }
现有代码避坑说明
print_bluetooth_thermal本身只做蓝牙数据透传,不限制发送的指令格式,不管是ESC/POS还是TSC指令都可以正常传输,不需要额外更换打印库。- TSC模式下不要发送任何通过esc_pos库Generator生成的字节,这类字节全部是ESC/POS格式,TSC模式下打印机无法解析。
- 如果切换指令发送后打印机依然无响应,可以先在官方APP里把打印机切到小票模式,测试ESC/POS指令打印正常后,再测试代码发切换指令的逻辑,排除指令拼接错误问题。
内容的提问来源于stack exchange,提问作者Yahalom Software
相关产品推荐
相关产品推荐

