简介:面向电商仓储、商超零售、医疗检验、制造产线中需要批量标签打印的 Python 开发者和系统集成人员,可直接用 Python 控制 TSC 打印机输出条码、文字和图形,绕开繁琐的驱动配置,适用于有一定基础、希望快速落地的自动化项目。资源包整体仅 71KB,压缩后共 7 个文件,包括 Python 源码、已编译的 pyc 文件、官方 SDK 动态链接库 DLL、IDE 工程配置,以及 DLL 依赖查看工具,便于直接运行、调试和二次开发。示例工程以图形主界面为核心,通过 ctypes 加载官方 SDK,完整覆盖 OpenPort 打开端口、SendCommand 发送 ESC/POS 指令、条形码与文本排版、ClosePort 关闭连接等流程;同时演示了打印机连接、指令拼接、错误返回码检查与资源释放,并给出工程配置文件,可快速导入 Eclipse/PyDev 环境运行。目前已有 4067 人学习下载,适合作为入门 TSC 二次开发或 Python 硬件编程的参考;读者可对照源码理解 ctypes 调用动态链接库的方式,掌握 ESC/POS 指令的拼接套路,并在此基础上扩展出批量打印、数据库标签数据合并、图片处理等实际功能。
1. 直接用 Python 操作 TSC 打印机打印标签:从一条 TSPL 指令说起
接到需求的那一刻,对方通常只丢来一句话:“用 Python 把标签打出来,打印机是 TSC 的。” 听起来很简单,真上手才发现门道不少。Windows 下装好驱动能打不代表代码能打,代码能打不代表打得准,打得准不代表速度跟得上产线。这篇笔记不聊驱动是怎么装好的,只讲最常用的做法:应用通过 Socket 把指令发给打印机,让打印机自己完成排版、条码、中文和图片。适合两类人——一类是刚接手产线标签打印,对 TSPL 指令完全没概念的;另一类是已经能打印,但总在处理走纸偏移、中文乱码这类玄学问题,想一次性把坑填平的。内容全部基于真实调试中反复踩过的路径,你照做基本能跑通。
2. 控制方式选型:为什么我不在驱动层死磕,而是直接发 TSPL 指令
2.1 打印驱动做不了的那三件事
很多人的第一反应是用 win32print 或者 pywin32 调系统驱动把任务发给打印机。这条路在办公场景下没问题,但在标签打印场景里有几个绕不过去的限制。
其一,驱动方式你无法精确控制标签尺寸、间隙高度和打印浓度。不管是 TSC 官方驱动还是第三方通用驱动,虽然也有高级选项,但程序里动态改起来非常别扭。今天打 50x30 的标签,明天换 100x80,驱动配置界面来回切,程序侧反而成了黑匣子。其二,混合排版受限。TSC 的很多机型支持同时打印文本、一维码、二维码、图片以及反白内容。这种多元素混排如果用驱动打,往往是先拼图再整幅输出,处理 RGB 转灰度、DPI 换算、纸张偏移非常麻烦。其三,脱离系统依赖。驱动的能力绑定操作系统,产线机台动不动就换系统、换电脑,每次换环境都要重新走一遍驱动配置流程。
直接发指令则完全不同。市面上主流的 TSC 机型(如 TTP-244 Pro、TTP-247、TX200 等)都兼容 TSPL 指令集。TSPL 本质上是一套文本指令,你把排版规则用字符串描述出来,交给打印机固件解析执行。亮点在于:打印尺寸、浓度、速度、间隙全是指令参数,程序里改一个数值就能切换标签规格——这一点的便利性,驱动方式完全比不了。
2.2 三种通信链路怎么选
常见的物理链路有三种:以太网(Socket)、串口 RS232、USB 虚拟串口。
以太网是最推荐的方式。产线环境里打印机通常固定摆在一个位置,给它配一个静态 IP,代码里直接socket.connect((ip, port))就能发指令。它的优势是跨平台——不管 Windows 还是 Linux,不管代码跑在 PC 还是工控机上,连接逻辑完全一致,不依赖任何驱动。TSC 打印机的网络端口默认是9100,这个端口几乎是业界通用端口。
串口适合老设备、调试场景,需要关注波特率、数据位、校验位这些参数,一般出厂默认是 19200 8 None 1。USB 虚拟串口则在只配了 USB 线、没连网线的场合用。但 USB 虚拟串口有一个坑:Windows 会分配一个虚拟 COM 口,换 USB 口或者换电脑 COM 口号就会变,代码里的串口号得跟着改,极易翻车。
如果你问我哪种方式最省心,答案一定是 Socket。为了后面演示代码统一,所有示例我都按 Socket 链路写,串口和 USB 的原理完全一致,只是把发送端换成serial.Serial而已。
2.3 一条 TSPL 指令的解剖
先把最简单的一条指令拆开看,这条指令是打开标签模式:
SIZE 50 mm,30 mm先看SIZE,它声明标签纸的物理尺寸,单位可以是 mm(毫米)、inch(英寸)、dot(点)。50 表示宽度,30 表示高度。这条指令必须在每条打印任务前发一次,哪怕上一次打印用的也是同样尺寸,也建议每次任务都带。
再看:
GAP 2 mm,0GAP声明标签纸间隙,也就是两张标签之间那段空白。如果标签是连续纸(没有间隙)或者黑标纸,情况又不一样。连续纸用GAP 0,0;黑标纸要用BLINE命令,或者直接不声明。很多打印偏移的毛病,根源就在标签类型和指令不匹配,这一点后面避坑章会单独讲。
有了这两条指令,打印机就知道了标签的物理边界,后面所有元素的坐标都会按这个边界来算。接下来就可以真正往界面上放内容了,比如放一个文本:
TEXT 10,10,"TSS24.BF2",0,1,1,"HELLO"别看参数多,规律很简单。格式是TEXT 横坐标,纵坐标,字体名,旋转角度,放大倍数X,放大倍数Y,"内容"。这是一个极简的坐标定位体系,掌握了它,任何元素都是同一套逻辑——在坐标系统里摆位置。
3. 第一张标签:从建立连接到走完一次完整打印
3.1 先用 Socket 发一条指令探路
动手写代码之前,我先告诉你一个判断打印机是否在线的小技巧。TSC 打印机监听 9100 端口,你甚至不需要写任何打印逻辑,直接用 Python 的 socket 连上去发一条没有任何副作用的状态查询指令,能收到应答就说明通信链路是通的。我通常用SYSTEM VARIABLE指令,格式如下:
import socket def check_printer(ip, port=9100, timeout=5): """ 探测打印机在线状态,并读取设备变量 Args: ip: 打印机IP地址 port: 打印机端口,默认9100 timeout: 连接超时时间,秒 Returns: tuple: (在线状态, 设备信息字符串) """ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(timeout) try: s.connect((ip, port)) # 读取设备变量,这是一个查询类TSPL指令 cmd = "SYSTEM VARIABLE\n" s.send(cmd.encode("ascii")) # 读取响应数据 resp = s.recv(1024).decode("ascii", errors="replace") return True, resp.strip() except Exception as e: return False, str(e) finally: s.close() online, info = check_printer("192.168.1.100") if online: print(f"打印机在线,设备反馈: {info}") else: print(f"连接失败: {info}")这里的重点在于SYSTEM VARIABLE指令的收尾必须加换行符\n。打印机固件是按行解析指令的,少一个换行符,指令就滞留缓冲区,永远得不到响应。超时时间我习惯给 5 秒,产线网络哪怕有些波动也够用了。
3.2 完整的单标签打印代码
探明链路之后,真正的打印流程来了。整体逻辑是一串 TSPL 指令拼接好后,一次性发给打印机,最后加一条PRINT 1,1触发打印。下面这段代码是我日常项目中在用的简化版:
import socket def print_label(ip, port=9100, timeout=5): """ 发送完整TSPL指令组,打印单张标签 指令拼接顺序必须遵守: 1. SIZE: 标签尺寸 2. GAP: 标签间隙 3. CLS: 清空图像缓冲区 4. 绘制元素(文本/条码/图片) 5. PRINT: 触发打印 """ label_width_mm = 50 label_height_mm = 30 gap_mm = 2 # 拼接TSPL指令。注意每一行都要以\n结尾 tspl_cmds = [ f"SIZE {label_width_mm} mm,{label_height_mm} mm", f"GAP {gap_mm} mm,0", "CLS", # 清空当前图像缓冲区,不加会导致元素叠加 'TEXT 10,10,"TSS24.BF2",0,1,1,"Hello TSC"', "PRINT 1,1" # 打印份数为1 ] # 拼接并发送,join追加\n等价于每行独立send cmd_str = "\n".join(tsp1_cmds) + "\n" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(timeout) try: s.connect((ip, port)) s.send(cmd_str.encode("ascii")) s.close() return True except Exception as e: print(f"打印失败: {e}") return False参数说明:
SIZE 50 mm,30 mm表示单张标签宽 50mm、高 30mm。GAP 2 mm,0表示标签间隙 2mm,第二参数 0 不影响通用场合。CLS必须存在。它清空打印机闪存中的图片缓冲区,作用是防止上一次打印的图形残留在缓冲区里和本次内容叠加。PRINT 1,1的完整含义是PRINT 份数,每份之间的拷贝间隔。在这个场景下,打印 1 份,拷贝间隔设为 1 即可。
有一个容易忽略的点:TEXT 指令里的字体名TSS24.BF2是 TSC 打印机内置的字体文件。不同机型内置字体名可能不同,TTP-244 系常用TSS24.BF2,部分新机型用的是TST24.BF2。如果你发出的字体名在固件里找不到,打印机会默认使用某个替代字体,在某些情况下显示效果会不一样。这一个细节值得记下来。
3.3 设置打印速度和浓度:两个关键参数
很多人打印一张出来发现颜色浅淡,第一个怀疑是碳带问题,其实多数情况是浓度没调。先看一条带参数的设置指令:
# 在SIZE之前设置打印速度和浓度 # SPEED 单位: 英寸/秒,可选2,3,4,5,6等 # DENSITY 取值范围: 0~15,数值越大颜色越深 speed = 4 density = 10 tsp1_cmds = [ f"SPEED {speed}", f"DENSITY {density}", f"SIZE {label_width_mm} mm,{label_height_mm} mm", ... ]SPEED是打印速度。4 表示 4 英寸/秒,这是一个比较稳妥的中间值。如果打印的标签上只有简单文本,可以开 6;如果有密集条码或者小号字体,建议降到 3。速度太高,打印头加热时间不足,条码边缘会出现模糊,扫码率会直线下降。
DENSITY是打印浓度,代表打印头加热强度。0~15 共 16 个档位,常见标签纸在 9~12 之间表现正常。这个参数最麻烦的地方在于,它没有标准答案——和标签纸材质、碳带类型都有关系。蜡基碳带浓度 10 够用,混合基可能得 12,树脂基又要再调。我的习惯是从 9 起步,打一张看效果,再逐档往上加,每次查看条码边缘是否发毛。
3.4 代码里坐标转换的两个单位
写 TSPL 指令时,人们最容易掉进去的坑是单位。所有坐标参数的单位都是 dot(点),也就是物理打印点。标签纸宽 50mm,TSC 常见机型分辨率 203dpi,50mm 换算过来大概是 400 个点,也就是 50 / 25.4 * 203 ≈ 400 dot。
如果你买的是 300dpi 的机型,同样 50mm 宽度就是 50 / 25.4 * 300 ≈ 591 dot。同样的代码,在 203dpi 和 300dpi 机器上打出来的排版会明显不一样。所以我一般会在代码里封装一层单位换算:
def mm_to_dot(mm, dpi=203): """毫米转打印点""" return int(round(mm / 25.4 * dpi))换算时务必四舍五入后再组合指令。TSPL 坐标根本不给小数,直接给小数指令固件无法解析,这一条能帮你少翻一个车。
4. Python 实操进阶:中文、条码、图片与批量打印
4.1 中文打印:编码方式和字体文件的搭配
TSPL 做中文本地化有个先天限制:内置字体文件通常只覆盖 ASCII 字符集。想打中文,几乎绕不开BLOCK指令配合下载到打印机的中文字库。最常用的替代方案是使用TEXT配合TST24.BF2类大字符集字体,或者用BLOCK指令指定文字区域。
我用得最顺的方法是BLOCK指令。它和TEXT的主要区别是多了一个区域宽高参数,文字在区域内自动换行。典型指令如下:
BLOCK 10,10,200,50,"TSS24.BF2",0,1,1,"中文标签内容"但这里有个前置条件:打印机固件里必须预先烧录中文字库。多数 TSC 行货出厂时会内置一套中文字库,但部分通过其他渠道流入的机器可能没有。判断方法很简单,打一个中文文本,如果打印出来是空心方块或者乱码,十有八九是字库缺失。
代码层面要注意的是编码问题。我见过很多人直接在指令里拼中文,结果打印出来全是问号。正确做法是:先把中文字符串编码为 GBK 或 UTF-8,再按打印机实际支持的字库决定要不要转换。常见做法是:
def append_block_with_chinese(params): """ 组装含中文的BLOCK指令 注意:TSPL指令必须用ascii编码发送,中文以转义形式处理。 实际开发中,推荐预先确认打印机固件字库,并用UTF-8转GBK。 """ text_content = "中文标签内容" # 若打印机字库为GBK编码,先做一次转换 gbk_text = text_content.encode("gbk", errors="ignore").decode("gbk") cmd = f'BLOCK 10,10,200,50,"TSS24.BF2",0,1,1,"{gbk_text}"' return cmderrors="ignore"是我刻意加上的。如果某个生僻字在 GBK 里不存在,与其让它变成乱码,不如直接忽略掉,保证打印任务不断。说到底,中文字库问题不是代码能完全解决的,换机器时先确认固件有字库,比在代码里死磕要有用得多。
4.2 条码和二维码:参数比想象中要多
条码是标签打印里比重最大的需求。TSPL 里条码指令是BARCODE,二维码是QRCODE。先看一维码:
BARCODE 10,50,"128",80,1,0,2,2,"ABC123456"拆开看参数:横坐标、纵坐标、码制(Code128、Code39、EAN-13 等)、条码高度(dot)、是否显示可读字符(1 显示/0 不显示)、条码方向、窄条宽度、宽条宽度,最后是条码内容。这里"128"是 Code128 码制的固定写法,注意是字符串。
窄条宽度和宽条宽度这两个参数,直接影响扫码枪能不能识别。设置不对,条码打印出来发虚,扫码枪在那边狂叫“无此条码”。经验值是窄条 2 dot、宽条 4 dot,在小尺寸标签上可以窄条 1 dot、宽条 2 dot。但窄条小于 2 dot 后,对打印头状态和碳带质量极为敏感,不建议量产环境下使用。
二维码指令参数更多,看下面这个例子:
qrcode_cmd = 'QRCODE 10,100,0,4,0,0,0,"HELLO QRCODE"'参数解释:横坐标、纵坐标、纠错级别(0 代表 L 级,1 代表 M 级,2 代表 Q 级,3 代表 H 级)、单元大小(2~8,越大二维码越清楚)、模式、旋转角度、冗余位,最后是内容。单元大小(倍数)这个参数最重要,单元大小 4 在大多数标签上都合适。如果二维码内容长度超过 128 个字符,务必确认 QRCODE 的版本上限,否则会编码失败。二维码打出来扫描出乱码,还有另一种情况是编码格式问题——TSPL 的 QRCODE 默认按 ISO 字符集处理二进制数据,如果你塞进去的内容包含非 ASCII 字符,需要先处理成可打印的 ASCII 形式。
4.3 图片打印:BMP 是 TSC 的母语
TSPL 支持直接打印图片,但兼容性最好的格式是单色 BMP(黑白位图)。彩色 JPEG 和 PNG 要么不被支持,要么会因色彩转换产生恐怖的输出效果。
把彩色图片转成单色 BMP 是打印前必须做的一步。我一般用 Pillow 库处理:
from PIL import Image def convert_to_mono_bmp(src_path, dst_path, dpi=203): """ 将普通图片转换为TSPL可用的单色BMP 核心步骤: 1. 转灰度模式,去掉色彩信息 2. 按打印分辨率重新缩放 3. 转换为1-bit位图模式,阈值默认127 返回: 处理后的图片尺寸(dot) """ img = Image.open(src_path) # 转为灰度图 img = img.convert("L") # 根据目标DPI计算缩放尺寸,这里保持原始宽高比 target_width_px = int(50 / 25.4 * dpi) # 50mm宽的图片在203dpi下的像素宽度 ratio = target_width_px / img.width target_height_px = int(img.height * ratio) img = img.resize((target_width_px, target_height_px), Image.LANCZOS) # 转1-bit,阈值127:灰度大于127为白,小于为黑 img = img.convert("1", dither=Image.NONE) img.save(dst_path, "BMP") return target_width_px, target_height_px转换逻辑里有几个容易踩的点。第一,缩放算法在照片素材上 LANCZOS 表现不错,但在小标识、Logo 上反而可能产生边缘毛刺,这种情况用 NEAREST(最近邻)更合适。第二,阈值 127 意味着灰度在 128 以上的像素会变白,如果你的 Logo 是深色背景浅色文字,需要先反色再转换。第三,dither=Image.NONE代表不做抖动,做抖动可以模拟灰度过渡,但打印出来效果往往斑驳不堪,所以我默认关掉。
拿到单色 BMP 之后,TSPL 里用PUTBMP指令把它放到指定位置:
PUTBMP 10,80,"C:\\IMAGE\\LOGO.BMP"PUTBMP 的坐标是图片左上角的位置,后面跟图片在打印机存储中的路径。这里容易有一个认知偏差:PUTBMP并不是从你的电脑读取图片,而是从打印机的存储(内存或闪存)读取。所以你得先把图片下载到打印机里。这一步在 Python 里怎么做?用指令DOWNLOAD:
def download_bmp(ip, port, local_bmp_path, printer_path="C:\\TEMP\\LOGO.BMP"): """ 把本地BMP文件通过DOWNLOAD指令发送到打印机存储 DOWNLOAD指令格式: DOWNLOAD 路径,文件大小 随后必须二进制传输文件数据 注意:文件大小必须是实际字节数,不精确会导致存储失败 """ import os file_size = os.path.getsize(local_bmp_path) cmd = f"DOWNLOAD {printer_path},{file_size}\n" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, port)) s.send(cmd.encode("ascii")) # 以大块方式传文件,避免一次性读大文件占用内存 with open(local_bmp_path, "rb") as f: while True: chunk = f.read(4096) if not chunk: break s.send(chunk) s.close()DOWNLOAD指令的格式是路径在后跟逗号加文件大小,这个文件大小必须精确到字节。传完之后直接调用PUTBMP把图片显示在标签上。图片文件若很大,建议传完后等 500 毫秒再发后续指令,防止打印机异步处理还没来得及落盘就收到 PUTBMP 导致图片缺失。
4.4 批量打印:一份一循环还是多份一循环
批量打印时核心决策点是:每张标签发一套CLS加内容的指令,还是用一份指令打多份?
TSPL 的PRINT n,m本身就支持一次打印 n 份。如果每张内容完全相同,直接PRINT 5,1一次性打 5 张最省时间。但产线场景通常是流水号递增、内容不同,每条数据都要单独排版。
我采用的模式是:循环内每张拼接指令并发送,每张之间间隔 0.3~0.5 秒。这个间隔不是随意的——打印机收到PRINT 1,1后会先走纸再打印,这一套动作需要时间,发太快指令会在缓冲区堆积,后一张的排版可能把前一张还没打印的缓冲区挤掉。慢一点,让打印机有时间消化每一条指令,效果远好过超高速发送。
5. 避坑与排查:打印效果不对时先看这五条
5.1 标签走纸不准,内容印在两张标签的接缝上
现象:打印出来的内容纵向偏移,有时一半在上一张,一半在下一张,越打偏移越明显。
原因:GAP参数和实际标签纸不匹配是最常见的根源。间隙传感器通过检测标签纸透光率差异来定位标签。如果你声明GAP 2 mm,但实际用的是连续纸(没有间隙),那么传感器永远等不到间隙信号,走纸就会“飘”。另一种情况是标签纸有间隙,但你用了黑标纸却忘了声明BLINE。
解决:先在驱动或 TSPL 指令里明确标签类型。间隙纸用GAP,黑标纸用BLINE,连续纸用GAP 0,0。如果参数没错但偏移仍存在,做一次手动校准。TSC 机型通常支持在面板上长按走纸键进入校准模式,走几张纸自学习间隙位置。现在我把GAP参数放在每条打印指令的第一行,换纸之后先手动校准,一直以来效果都很稳。
5.2 打印出来全是乱码或问号
现象:中文内容打出来变成“??”或者一堆不认识的黑块;英文正常,中文必乱。
原因:绝大多数情况是打印机固件里中文字库缺失或编码不匹配。打印机在收到非 ASCII 字符时,如果找不到对应字库中的字模,就输出一个占位符。
解决:先用打印机的面板打印一张系统自检页(通常叫 Self Test),确认机型是否内置中文字库。如果没有,要么联系供应商烧录字库,要么换另一款内置中文字库的型号。代码层面则可尝试将字符串从 UTF-8 转成 GBK 再发。在已经确认字库存在的前提下,乱码基本都出在编码转换这步。
5.3 条码扫码枪扫不出来
现象:条码打印出来肉眼看很清楚,线条边缘也锐利,但扫码枪提示“未找到条码”。
原因:条码的窄条宽度(模块宽度)设置太窄。2dot 之下,打印头单个加热点存在扩散效应,窄条打出来会粘连;另外一个高频原因是打印浓度过高,导致黑条之间染墨,扫码枪无法识别间隔。
解决:将BARCODE指令里的窄条宽度和宽条宽度改成 2,4 起步,浓度从 12 以上调到 9~10。这种翻车十次里有八次是浓度太高,条码被打印成“一根棍”。我现在的习惯是,打条码之前先打印一张纯浓度梯度测试图,确认在哪个档位下条码边缘最干净,记录在该型号碳带下长期复用。
5.4 PUTBMP 指令执行了但图片没打出来
现象:代码没报错,指令也发了,标签上该出现 Logo 的位置是空白。
原因:常见原因有两个——第一,图片根本没有下载到打印机存储器,程序直接跳过了DOWNLOAD只发了PUTBMP;第二,DOWNLOAD发送的文件大小与服务器端不一致,固件判定文件损坏,不保存。
解决:先在代码里检查本地 BMP 文件大小,并在代码中把文件重新DOWNLOAD一遍再PUTBMP,确保流程顺序。有人会觉得“上次传过了这次就不用传”,但打印机断电重启之后闪存里文件可能还在,内存里的镜像却会丢,我把下载动作做成每次打印前强制执行,稳妥得多。这一点属于典型的坑:看似不必要的重复,其实是给不确定性上保险。
5.5 打印任务发过去了,打印机一直没反应
现象:代码执行完毕,打印机指示灯不闪,标签纸也不出来。检查网络连接也是通的。
原因:指令里存在语法错误,打印机固件在解析时发现了非法格式,直接丢弃整条指令。常见语法问题包括:指令缺少换行符、中文字符串里的双引号未转义、坐标值带了小数、PRINT的份数参数写了 0。
解决:把拼好的指令字符串通过repr()打印出来,检查换行符和引号配对。最容易忽略的是TEXT内容中的引号——如果标签内容本身包含英文双引号,TSPL 会把它当成字符串终止符,内容就断了。这里我会对用户输入统一做一次replace('"', "'")。这种发送方看着没问题、打印机没响应的场景,基本就是这类语法细节在作怪。遇到时往指令字符串上找,不要先怀疑端口。
6. 打印质量自查:批量任务前用这张“测试标签”兜底
不说原理,说直接能用的办法。每次换新纸、换碳带、换机型之后,在正式任务前我都强制跑一遍固定格式的测试标签。这张标签包含四个元素:一段 6 号中文文字、一组 Code128 条码(内容含有字母数字符号)、一个小尺寸的二维码、一张自带灰阶过渡的位图。
代码大概是这个路子:
test_cmd = [ "SIZE 50 mm,30 mm", "GAP 2 mm,0", "CLS", 'SPEED 4', 'DENSITY 10', 'TEXT 10,10,"TSS24.BF2",0,1,1,"测试文字Test"', 'BARCODE 10,100,"128",80,1,0,2,4,"TSC-2024-01"', 'QRCODE 10,180,0,4,0,0,0,"TEST-001"', "PRINT 1,1" ]打出来之后我只看四个点。一,中文字迹笔划没有断墨,不出现空心方块。二,条码下方的手工可读字符清晰,扫码枪能在 10cm 距离一次识别。三,二维码在微信里能扫出原文,而不是乱码。四,位图边缘没有明显锯齿,黑白色块没有扩散串色。只要这四项过了,后面的批量任务大概率不会翻车。你会发现,这套自查逻辑里至少有三项都和“浓度、速度、分辨率”这三个基础参数有关——处理好了能让产品少挨很多骂。
印象最深的是有一次某个现场打了几千张二维码,对方说“扫码率九成不到”,我远程让他跑这张测试标签,结果发现他那台机器浓度被上一拨人调到了 14,白底都开始泛灰。降到 10 之后再扫,扫码率直接回到 99.9% 以上。从那以后我每次换纸换碳带都强制自己先跑一遍这张测试页,不急着开工,它替我省下来的返工纸钱至少够我喝一年咖啡。希望帮到你。
本文还有配套的精品资源,点击获取