蓝牙打印机TSPL指令打印无响应问题求助
问题描述
我们计划开发一款从蓝牙打印机打印发票的应用,使用如下TSPL指令:
String bytes = "SIZE 3,2" "DIRECTION 1,0" "GAP 0,0\n" "REFERENCE 0,0" "OFFSET 0mm" "SET PEEL OFF" "SET CUTTER OFF" "SET PARTIAL_CUTTER OFF" "SET TEAR ON" "CLS" "TEXT 10,100, \"ROMAN.TTF\",0,1,1,\" MALINCINSI \"" "TEXT 10,120, \"ROMAN.TTF\",0,1,1,\" MALINCINSI \"" "TEXT 10,150, \"ROMAN.TTF\",0,1,1,\" KDV: %18 \"" "TEXT 10,200, \"ROMAN.TTF\",0,3,2,\" 12.79 \"" "BARCODE 328,386,\"128M\",102,0,180,3,6,\"!10512345678\"" "TEXT 328, 250, \"ROMAN.TTF\",0,1,1,\"12345678\"" "PRINT 1,1" ;
目前使用bluetooth_thermal_printer: ^0.0.6和esc_pos_utils包,通过以下代码发送指令:
final result = await BluetoothThermalPrinter.writeText(bytes);
调试控制台返回true,但蓝牙打印机在TSPL模式下始终无打印输出。需要可行的实现方法或适配的包来完成TSPL指令的发送与打印。
问题排查与解决方案
1. 修复TSPL指令格式问题
你的TSPL指令存在缺少换行符的核心问题:TSPL要求每条指令必须以换行符(\n)结尾,否则打印机无法正确拆分并解析指令序列。当前只有GAP 0,0后有换行,其余指令连在一起,打印机无法识别完整指令逻辑。
调整后的标准TSPL指令示例:
String tsplCommand = """ SIZE 3,2\n DIRECTION 1,0\n GAP 0,0\n REFERENCE 0,0\n OFFSET 0mm\n SET PEEL OFF\n SET CUTTER OFF\n SET PARTIAL_CUTTER OFF\n SET TEAR ON\n CLS\n TEXT 10,100, "ROMAN.TTF",0,1,1," MALINCINSI "\n TEXT 10,120, "ROMAN.TTF",0,1,1," MALINCINSI "\n TEXT 10,150, "ROMAN.TTF",0,1,1," KDV: %18 "\n TEXT 10,200, "ROMAN.TTF",0,3,2," 12.79 "\n BARCODE 328,386,"128M",102,0,180,3,6,"!10512345678"\n TEXT 328, 250, "ROMAN.TTF",0,1,1,"12345678"\n PRINT 1,1\n """;
2. 替换适配TSPL的蓝牙打印包
bluetooth_thermal_printer: ^0.0.6主要针对ESC/POS指令设计,对TSPL的支持不完善,推荐使用以下两种方案:
(1)flutter_blue_plus + 自定义字节流发送
flutter_blue_plus是Flutter生态中稳定的低阶蓝牙通信库,可直接向打印机发送原始TSPL字节流,完全适配TSPL协议:
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'dart:convert'; // 提前获取打印机的可写特征(需先扫描配对蓝牙设备) BluetoothCharacteristic? printCharacteristic; Future<void> sendTspl(String command) async { if (printCharacteristic == null) return; // 多数TSPL打印机支持UTF-8编码,部分老设备需用GBK,可根据实际情况调整 List<int> bytes = utf8.encode(command); await printCharacteristic!.write(bytes, withoutResponse: true); }
使用前需扫描蓝牙设备,找到打印机的串口服务特征(通用UUID通常为0000ffe1-0000-1000-8000-00805f9b34fb)。
(2)使用专门的tspl_printer包
部分开发者维护的TSPL专用Flutter包,封装了指令生成和蓝牙发送逻辑,无需手动拼接TSPL字符串:
import 'package:tspl_printer/tspl_printer.dart'; // 连接打印机 await TsplPrinter.connect("打印机蓝牙MAC地址"); // 生成并打印发票内容 await TsplPrinter.printTicket( width: 80, height: 100, commands: [ TsplText(x: 10, y: 100, text: "MALINCINSI", size: 1), TsplText(x: 10, y: 150, text: "KDV: %18", size: 1), TsplText(x: 10, y: 200, text: "12.79", size: 3), TsplBarcode(x: 328, y: 386, code: "10512345678", type: BarcodeType.code128), TsplPrint(copies: 1), ], );
3. 额外验证步骤
- 确认打印机已切换到TSPL模式:部分打印机支持ESC/POS和TSPL切换,需通过硬件按键或专用指令切换;
- 检查蓝牙连接稳定性:尝试重新配对设备,避免连接中断;
- 验证指令有效性:用电脑端串口助手发送调整后的TSPL指令,排除打印机硬件故障。
内容的提问来源于stack exchange,提问作者Alperen Aygün
相关产品推荐
相关产品推荐

