简介:炜煌微型打印机手册面向嵌入式开发、仪器仪表集成与设备维护人员,系统整理 WH 系列热敏微打的硬件接口与指令协议,适合需要将微型打印机接入单片机或工控主机的工程师查阅对照。全套资料为 1 个 doc 文档,压缩包约 825KB,正文按性能参数、并行接口的安装与使用、串行接口的安装与使用、打印命令详解、热敏微打命令速查表、西文字符集、标准 ASCII 码与国际一、二级汉字库、型号结构说明等章节编排,并附 CPU 与打印机连接的电路原理图、I/O 口模式与总线模式的核心程序示例以及并行接口定时图,可据此完成接线与驱动调试。已有 1620 人学习下载。读者可从中获取 57.5mm 纸宽、384 点/行、约 70mm 每秒走纸等具体指标,快速定位命令格式与速查条目,并了解医疗、衡器、银行、消防、电力、税控等场景下的选型与接口配置思路。
1. 热敏微型打印机手册:把参数、接口和命令一次讲透的落地底稿
热敏微型打印机手册不是随手翻的规格书。设备现场常见的一幕是:串口能连上,打印机却吐乱码;并口线焊好,打半行就错位;想打带汉字和自定义符号的小票,命令发过去没反应。这份手册把性能参数、并行接口、串行接口、打印命令、速查表、西文字符集、ASCII与一二级汉字库、型号结构摊开,能拿着它从接线、设波特率一路查到命令字段。适合嵌入式工程师、设备维护人员、做仪器仪表集成的开发者,以及给告警终端、电子衡器、商超收银、餐饮设备加打印模块的人。它解决的是“这块板子接上去为什么不出字、参数该填多少、命令边界在哪”的落地问题。
2. 硬件接口与打印参数:从 57.5mm 纸宽反推驱动边界
2.1 先锁打印头和纸路参数
拿到手册先看参数表,不要急着写驱动。后面所有字符数、行距、图形宽度都受这些数字约束,纸宽和打印密度一旦看错,代码写得再顺也会打歪。手册给出的核心参数如下:
| 项目 | 参数 | 对驱动的约束 |
|---|---|---|
| 打印方法 | 直接热敏打印 | 只能配热敏纸,纸面涂层朝向打印头 |
| 打印纸宽 | 57.5±0.5mm | 纸卷仓和导纸结构按这个公差做 |
| 打印密度 | 8点/mm,384点/行 | 每行点数是固定上限,字符放大后要重算 |
| 打印速度 | 约70mm/秒或20行/秒 | 大量连续打印时按这个估算耗时 |
| 打印头寿命 | 6×10^6字符行 | 高频打印场景要算耗材和头寿命 |
| 有效打印宽度 | 48mm | 左右留边,排版不要顶满57.5mm |
| 走纸速度 | 约70mm/秒或20行/秒 | 进退纸命令的机械响应按此估算 |
| 操作温度 | 5~50℃ | 低温环境先预热或降速使用 |
| 操作相对湿度 | 10~80% | 高湿环境注意纸卷受潮 |
| 储存温度 | -20~60℃ | 长期库存后先回温再上电 |
| 储存相对湿度 | 10~90% | 纸卷密封保存 |
| 电源 | 直流5V,3A | 峰值电流按3A留余量,不能只按逻辑电流算 |
384点/行是最该先记住的数字。16点阵汉字按16点宽计算,一行理论上是24个汉字;24点阵汉字按24点宽计算,一行是16个汉字。字符间距命令一旦设了非零值,每行可打印字符数会继续下降。有效打印宽度48mm对应384点,纸宽57.5mm是机械宽度,不要把排版宽度直接按57.5mm算。
// 按384点/行估算每行可打印字符数,n为字符间距点数 #define DOTS_PER_LINE 384 int chars_per_line_16dot(int gap) { // 16点阵汉字宽16点,字符间距gap点 return DOTS_PER_LINE / (16 + gap); } int chars_per_line_24dot(int gap) { // 24点阵汉字宽24点,字符间距gap点 return DOTS_PER_LINE / (24 + gap); }这段只做排版估算,不替代实际试打。参数说明:gap对应字符间距命令里的n值,默认0;16点阵和24点阵要分开算,因为同一行能放的汉字数不同。实际项目里我一般会先按估算值排版,再打一张满行测试纸,看最后几个字符有没有被截断。遇到汉字和西文混排,西文字符宽度不同,保守做法是按最宽字符留余量。
2.2 并口接线:STB/BUSY/ACK 的握手边界
并行接口这部分,手册给的不是“接上就能用”的图,而是带时序的握手关系。数据线DATA1~DATA8是输入到打印机,STB是数据选通触发脉冲,上升沿读入数据;BUSY高电平表示打印机忙,不能接收数据;ACK低电平表示数据已被接受而且打印机准备好接收下一数据;PE高电平表示缺纸;SEL高电平表示打印机在线;ERR高电平表示无故障。信号逻辑电平是TTL。
| 面板式引脚 | 平台式引脚 | 信号 | 方向 | 说明 |
|---|---|---|---|---|
| 1 | 1 | -STB | 入 | 数据选通触发脉冲,上升沿读入数据 |
| 3 | 2 | DATA1 | 入 | 并行数据第1位 |
| 5 | 3 | DATA2 | 入 | 并行数据第2位 |
| 7 | 4 | DATA3 | 入 | 并行数据第3位 |
| 9 | 5 | DATA4 | 入 | 并行数据第4位 |
| 11 | 6 | DATA5 | 入 | 并行数据第5位 |
| 13 | 7 | DATA6 | 入 | 并行数据第6位 |
| 15 | 8 | DATA7 | 入 | 并行数据第7位 |
| 17 | 9 | DATA8 | 入 | 并行数据第8位 |
| 19 | 10 | -ACK | 出 | 低电平表示数据已被接受 |
| 21 | 11 | BUSY | 出 | 高电平表示打印机正忙 |
| 23 | 12 | PE | 出 | 高电平表示缺纸 |
| 25 | 13 | SEL | 出 | 高电平表示打印机在线 |
| 4 | 15 | -ERR | 出 | 高电平表示无故障 |
| 10-24偶数 | 25、18 | GND | — | 接地,逻辑0电平 |
时序参数按手册抓:T1>2us,T2>30ns,T3<40ns,T4<5us,T5约4us。不同板子的GPIO翻转速度差别很大,血泪经验是不要用“能跑就行”的延时,先把STB低脉宽做到明显大于2us,再留出数据建立和保持余量。下面是一段并口写字节的参考实现,实际端口名按你的MCU改。
// 并口写一个字节,BUSY高电平等待,STB上升沿锁存 #define DATA_PORT P2 #define STB P1_0 #define BUSY P1_2 #define ACK P1_1 #define DELAY_US x static void par_write_byte(unsigned char v) { while (BUSY) { // 等待打印机不忙,必要时加超时计数 } DATA_PORT = v; // 数据建立时间留余量,对应手册T2 delay_ns(100); STB = 0; // STB低脉宽大于2us,对应T1 delay_us(3); STB = 1; // 可选:等待ACK低电平,低有效;生产代码要加超时 // while (ACK) {} }逻辑说明:先查BUSY再放数据,避免打印机忙时覆盖数据;STB先拉低再拉高,靠上升沿让打印机读入;低脉宽按T1留3us,比2us最小值多留1us。参数说明:DATA_PORT是8位数据口,STB和BUSY按实际引脚改;delay_us(3)不是精确值,要用示波器看STB脉宽和DATA建立时间;ACK查询不是必须,但加了能发现“数据没被接受”的异常。面板式和平台式插座引脚序号不同,接线前先确认机型结构,别拿一张图套所有机器。
2.3 串口与并口的选型差别
并口适合板内短距离连接,线多但时序可控,GPIO模拟也容易做;串口适合从面板或机箱外引出,线少,但RS-232C/EIA电平不能直接接MCU的TTL串口。手册里串口用MAX232做电平转换,MCU侧是TXD/RXD,打印机侧是EIA电平。选配的485、USB、无线接口是在标准串并口之外的选择,具体项目按主控资源和线缆长度定。
串口侧的流控靠BUSY信号,不能只发不管。打印机BUSY高电平时表示正忙,不能接收数据;低电平时表示准备好。并口侧同样有BUSY,差别在并口还有STB选通和ACK应答。用并口时BUSY查询频率高,用串口时BUSY可以作为GPIO查询,也可以在发送前查一次、发送中按字节查。不要等一整包数据发完才看BUSY,打印机内部缓冲区小的时候会丢字节。
2.4 最小上电闭环
上电闭环按顺序做,不要一上来就跑业务协议。第一步,用直流5V/3A电源,先测空载电压,再接打印机,观察上电瞬间电压跌落;第二步,装好57.5mm热敏纸,纸头平直,涂层朝打印头;第三步,上电看自检或状态报告,串口机型会打印串口设置状态报告;第四步,发一个LF(0x0A),看是否走纸一行;第五步,发几个ASCII字符,确认字符方向、浓度和行距;第六步,查PE、SEL、ERR状态位,缺纸时PE应为高,在线时SEL为高,无故障时ERR为高。
注意:ERR高电平表示无故障,这是经电阻上拉后的逻辑,不要把它当成“报错高有效”。现场排查时先把PE、SEL、ERR三个状态位的有效电平抄在纸上,再写代码。
3. 串行接口落地:方式1/方式3、1200~19200 与 BUSY 流控
3.1 异步帧格式:10位和11位帧
串口连接采用异步传输格式。方式1一帧10位:1位起始位、8位数据位、1位停止位;方式3一帧11位:1位起始位、8位数据位、1位校验位、1位停止位。PC端常用8N1对应方式1,带校验位的8E1或8O1对应方式3,校验位具体是奇还是偶按实际设置走。帧格式不匹配时,最常见现象是能收到零星字符但整体乱码,或者完全没反应。
| 工作方式 | 起始位 | 数据位 | 校验位 | 停止位 | 一帧位数 |
|---|---|---|---|---|---|
| 方式1 | 1 | 8 | 无 | 1 | 10 |
| 方式3 | 1 | 8 | 1 | 1 | 11 |
选方式1还是方式3,看主控串口和线缆环境。短距离、干扰小的板内连接,方式1够用;线缆较长或现场有电机、继电器干扰,方式3加校验位更稳妥。校验位只能发现部分错误,不能替代协议层重发。打印内容里如果有大量汉字和自定义字符,建议在应用层加序号或回读状态,别把可靠性全压在串口校验上。
3.2 波特率与按键设置流程
串口波特率可在1200、2400、4800、9600、19200 B.P.S.内选择,出厂设定9600 B.P.S.。按任意键,打印机上电,打印出串口设置状态报告后即可对波特率和工作方式进行调整。SEL键切换打印机波特率,LF键切换串行口工作方式。修改完之后需要重新上电启动。
现场设置按这个顺序走:
- 断电,按住或准备好按键,上电,让打印机打出串口设置状态报告。
- 看报告里的当前波特率和方式,确认是9600还是其他值。
- 用SEL键切波特率,每按一次看报告或指示灯变化,切到目标值停住。
- 用LF键切方式1或方式3,注意方式3带校验位,主控端要同步改。
- 断电再上电,让设置生效。
- 主控端按新参数发测试字符,先发单字节,再发字符串。
注意:改完串口参数必须重新上电,不断电只改主控端参数,打印机仍按旧设置收数据,表现出来就是“怎么改都乱码”。
3.3 MAX232 与 RJ45 引脚
串口连接为RS-232C标准兼容,打印机可直接与IBM PC类设备相接。MCU侧不能直接接打印机串口,手册给的电路用MAX232做TTL与EIA电平转换。平台式和面板式串口引脚定义不同,接线前按壳体标识核对。
| 平台式串口 | 面板式串口 | 信号 | 方向 | 说明 |
|---|---|---|---|---|
| 2 | 5 | TxD | 入 | 打印机从主计算机接收数据 |
| 4 | 2 | BUSY | 出 | 高电平表示打印机正忙,低电平表示准备好 |
| 7 | 9 | GND | — | 信号地 |
| 5 | 6 | 同BUSY | 出 | 同BUSY信号 |
RJ45引脚定义也要记:2脚RXD入,3脚TXD出,4脚BUSY出,5脚GND,1脚和6脚N.C。RJ45的2、3脚是交叉关系,主控TXD接打印机RXD,主控RXD接打印机TXD,接反了发不出去。BUSY是高电平忙,低电平可接收,主控侧可以当输入查询。
3.4 串口最小初始化和回读验证
下面以11.059MHz晶振、9600波特率、方式1为例,给一段8051风格的初始化。不同MCU的寄存器名不同,思路一样:先配定时器1做波特率,再配串口方式,发送前查BUSY。
// 11.059MHz晶振,定时器1方式2,串口方式1,9600bps #define BUSY P1_0 void uart_init_9600(void) { TMOD = (TMOD & 0x0F) | 0x20; // 定时器1工作方式2 TH1 = 0xFD; // 11.059MHz下9600的初值 TL1 = 0xFD; TR1 = 1; // 启动定时器1 SCON = 0x50; // 串口方式1,允许接收 // 不开中断,先查询发送 } void uart_send_byte(unsigned char c) { while (BUSY) { // 打印机忙时等待,生产代码加超时 } SBUF = c; while (!TI) { // 等发送完成 } TI = 0; }逻辑说明:TH1=0xFD是11.059MHz晶振下9600波特率的常用初值,换晶振要重算;SCON=0x50把串口设成方式1并允许接收;发送前查BUSY,避免打印机缓冲区满时继续灌数据。参数说明:如果主控用方式3,SCON要改,校验位设置也要同步;如果晶振不是11.059MHz,TH1不能照抄。第一次联调先发0x0A走纸,再发“TEST123”,最后发汉字。汉字能不能打出来,还取决于字符集选择命令和码表,下一章再拆。
4. 打印命令拆解:ESC 序列、字符集切换与自定义字符
4.1 命令帧结构:ESC/FS + 参数 + NUL
打印控制命令由一字节控制码或ESC(或FS)控制码序列组成。单字节命令如LF是0x0A,HT是0x09,VT是0x0B;带参数命令是ESC加命令字符再加n;造表命令以NUL(0x00)结束。命令表不需要背,但要会查字段边界。
| 功能 | ASCII格式 | 16进制 | 参数边界 |
|---|---|---|---|
| 换行 | LF | 0A | 无 |
| 执行n点行走纸 | ESC J n | 1B 4A n | 1≤n≤255 |
| 执行n点行退纸 | ESC o n | 1B 6F n | 1≤n≤255 |
| 设置n点行间距 | ESC 1 n | 1B 31 n | 0≤n≤255,上电默认3 |
| 设置字符间距 | ESC p n | 1B 70 n | 0≤n≤255,默认0 |
| 设置右限 | ESC Q n | 1B 51 n | 0到行宽字符数,默认0 |
| 设置左限 | ESC l n | 1B 6C n | 0到行宽字符数,默认0 |
| 灰度打印 | ESC m n | 1B 6D n | 1~6,默认1 |
| 横向放大 | ESC U n | 1B 55 n | 1≤n≤8 |
| 纵向放大 | ESC V n | 1B 56 n | 1≤n≤8 |
| 横向纵向放大 | ESC W n | 1B 57 n | 1≤n≤8 |
| 下划线 | ESC - n | 1B 2D n | n=1允许,n=0禁止,默认0 |
| 上划线 | ESC + n | 1B 2B n | n=1允许,n=0禁止,默认0 |
| 反白 | ESC I n | 1B 49 n | n=1允许,n=0禁止,默认0 |
| 反向打印 | ESC c n | 1B 63 n | 面板式n=0反向,n=1正向;平台式相反 |
| 空格或空行 | ESC f m n | 1B 66 m n | m=0打n个空格,m=1打n行单位行 |
| 垂直造表 | ESC B n1...NUL | 1B 42 ... 00 | 最多8个间隔值 |
| 水平造表 | ESC D n1...NUL | 1B 44 ... 00 | 最多8个位置 |
命令帧最怕两件事:参数没加够,或者该以NUL结束的命令忘了发0x00。比如ESC B后面要跟n1、n2直到NUL,少一个0x00,打印机会把后面的正文当成造表参数读进去,表现出来是“命令发完后面几行文字消失”。
4.2 字符集与汉字库边界
选择字符集命令有两个:ESC 6(1B 36)选择字符集1,16点阵专有;ESC 7(1B 37)选择字符集2,16点阵专有。字符集1有224个字符,代码范围20H-FFH(32-255),包括ASCII字符和各种图形符号;字符集2有224个字符,代码范围20H-FFH,包括德、法、俄文、日语片假名等。24点阵热敏微打的字符集是字符集1的一部分,不是另起一套完整码表。
| 命令 | 16进制 | 字符集 | 代码范围 | 说明 |
|---|---|---|---|---|
| ESC 6 | 1B 36 | 字符集1 | 20H-FFH | ASCII和图形符号,16点阵专有 |
| ESC 7 | 1B 37 | 字符集2 | 20H-FFH | 德、法、俄文、日语片假名等,16点阵专有 |
打汉字之前先确认机型带的是哪套汉字库。手册写明自带一、二级汉字库和多个西文字库,但24点阵和16点阵的码表组织不同。现场常见翻车是:同一段GB码数据,16点阵机型能出字,24点阵机型出半个字或方框。原因不是数据坏了,是字符集和点阵模式没对上。我的做法是先把ESC 6发一遍,再打“测试123”,看汉字和ASCII是否都正常,再切ESC 7打特殊符号,确认码表范围。
4.3 格式控制:行距、字符间距、左右限、造表
行距命令ESC 1 n给后面的换行命令设置n点行间距,0≤n≤255,上电或初始化后n=3。字符间距命令ESC p n设定字符之间的空点,默认0,n在0~255之间。这两个参数直接改变每行能放多少字符,排版前先定死,不要一边打一边改。
左右限命令用来留边。ESC Q n设置右限,n是打印纸右侧不打印的字符数;ESC l n设置左限,n是左侧不打印的字符数。字符宽度按字符点阵宽度加字符间距计算,而且受放大缩小命令影响。上电或初始化后左右限都是0。做票据排版时,左限和右限一起用,比在数据里补空格更可靠。
造表命令分垂直和水平。ESC B n1 n2...NUL输入垂直造表间隔值,最多8个,单位行高度按8+行间距个点行计算,实际值是绝对的,不受字符放大缩小影响。VT命令进纸到下一垂直造表位置;如果位置已清除或当前位置已超过最后一个位置,VT只走纸一单位行。ESC D n1 n2...NUL输入水平造表位置,最多8个,每个字符宽度按字符点阵宽度+字间距计算,实际值是相对的,受放大缩小影响。HT命令走到下一水平造表位置;位置清除或已超过最后位置时,HT不执行。
灰度命令ESC m n的n取1~6,“1”颜色最浅,“6”颜色最深,默认1。这个命令是给不同热敏纸颜色深浅不一用的,不是所有纸都适合调到6。打印偏浅时先调灰度,再查电源和纸,不要一上来换打印头。放大命令ESC U n横向放大、ESC V n纵向放大、ESC W n横纵同时放大,n都是1~8;上电或初始化后16点阵n=2,24点阵n=1。上下划线、反白、反向打印都是开关型命令,n=1允许,n=0禁止,默认0。反向打印在面板式和平台式上的n含义相反,手册写得很细,换机型要重看这一条。
4.4 自定义字符与命令封装
用户自定义字符命令ESC & m n1 n2...ni,m是用户自定义字符码,32≤m≤61,分汉字16点阵和24点阵两种类型,n1、n2等是这个字符的数据。命令允许用户定义一个字符,定义后按m码打印。数据组织按字符点阵宽度和高度来,16点阵和24点阵长度不同,不要拿16点阵的数据去定义24点阵字符。
// 发送ESC带一个参数字节的命令,例如ESC 1 n、ESC p n、ESC m n static void send_esc_n(unsigned char cmd, unsigned char n) { uart_send_byte(0x1B); uart_send_byte(cmd); uart_send_byte(n); } // 打印一段演示:选字符集1、行距3点、字符间距0、灰度3、横向放大2 void print_demo(void) { uart_send_byte(0x1B); uart_send_byte(0x36); // ESC 6 选择字符集1 send_esc_n(0x31, 3); // ESC 1 n 行间距3点 send_esc_n(0x70, 0); // ESC p n 字符间距0 send_esc_n(0x6D, 3); // ESC m n 灰度3 send_esc_n(0x55, 2); // ESC U n 横向放大2倍 uart_send_string("TEST 123\r\n"); uart_send_byte(0x0A); // LF 换行 send_esc_n(0x55, 1); // 恢复横向放大1倍 }逻辑说明:先发ESC 6把字符集切到字符集1,再设行距、字符间距、灰度、放大,最后发正文和LF。参数说明:cmd是ESC后面的命令字符,n是参数字节;ESC 1的行距默认是3,这里显式设3是为了让代码不依赖上电默认值;灰度3是中间值,实际按纸调;放大2倍后每行字符数减半,排版要重算。自定义字符命令不要在业务循环里反复定义,上电初始化时定义一次,后面直接按m码打印。
5. 常见问题排查:乱码、丢字节和打印浅的 5 个现场记录
5.1 串口打印乱码:先看帧格式再怀疑线
现象:主控发“TEST123”,打印机出“T€§T”之类的乱码,或者只出第一个字符。原因:波特率、工作方式或校验位不匹配,也可能是主控TXD/RXD接反。手册里串口方式1是10位帧,方式3是11位帧,主控设8N1对应方式1,设8E1/8O1对应方式3。解决:先上电打串口设置状态报告,确认打印机当前波特率和方式;再用SEL键切波特率、LF键切方式,断电重上电;主控端按报告参数重配;最后用示波器看TXD波形位宽,9600下一位约104us。接反时主控发得出去但打印机收不到,交换TXD/RXD再试。
5.2 并口半行错位:BUSY 和 STB 时序没留余量
现象:打印一行,前半行正常,后半行错位或重复
本文还有配套的精品资源,点击获取