热敏打印机原理及其驱动相关知识

【说明】本文内容均来自网络,用于学习热敏打印机相关知识。

热敏打印机的工作原理是打印头上安装有半导体加热元件,打印头加热并接触热敏打印纸后就可以打印出需要的图案。

热敏打印机化学反应是在高温下进行的,当温度低于60℃时,纸需要经过相当长,甚至长达几年的时间才能变成深色;而当温度为200℃时,这种反映会在几微秒内完成。

打印机安装驱动的原因就是打印机厂商千差万别,不同的打印机往往都有各自的驱动,很难实现万能驱动。但是,在 POS 打印机行业却有一条捷径,就是现在市面上的 POS 打印机基本上都支持爱普生指令,也就是说,只要将程序和打印机联通,直接向端口里面写爱普生指令就可以控制打印机,打印机接受到爱普生指令以后,自行进行解析,然后打印出相应的内容。

ESC/P 是 Epson Standard Code for Printers 的缩写,有时也被写成Escape/P,它是由EPSON公司开发的一套打印机控制语言。它主要被用于点阵打印机,现在依然被广泛适用于 POS(票据)打印机。由于EPSON公司在针式打印机市场占有很大一部分份额,所以这套打印机控制命令已经成为针式打印机控制语言事实上的工业标准。

ESC/POS 打印命令集是 ESC/P 打印控制语言的简化版本,现在大多数POS打印机都采用ESC/POS指令集。其它打印控制命令的格式和功能也都与 ESC 指令集类似。

ESC 指令在形式上分为两种格式,一种是文本方式控制码,一种是 Escape 转义序列码。文本方式控制码由一字节字符码表示,实现的是与打印机硬件操作有关的指令,Escape 序列码由转义字符和参数字符或打印数据组成。

ESC/POS 从名字就可以看出和ESC转义码有关。没错,ESC/POS打印指令是以ESC转义字符(ASCII码27)开头。比如,ESC E指令是切换到打印字体加粗模式;ESC F指令则是接触字体加粗打印。

下面是从网上找到一个简介的指令代码和功能表:

  • CR:回车
  • ESC !:设置打印方式
  • ESC %:选择或取消用户自定义字符集
  • ESC &:定义用户自定义字符集
  • ESC *:设置位映射方式
  • ESC @:初始化打印机
  • ESC ~:LED ON/OFF
  • ESC <:返回行首
  • ESC 2:选择行间距为1/6英寸
  • ESC 3:设置行进为最小间距
  • ESC BEL:蜂鸣器ON/OFF
  • ESC C:设置单页长度
  • ESC c0:选择打印页
  • ESC c1:选择行间距
  • ESC c3:选择纸结束信号输出
  • ESC c4:选择打印纸及检测器(终止打印)
  • ESC c5:禁止/使能面板开关
  • ESC c6:禁止/使能ON-LINE开关
  • ESC d:打印及N行进纸
  • ESC D:设置TAB位置
  • ESC e:打印病退回N行
  • ESC f:设单页等待时间
  • ESC F:选择或取消单页退纸区
  • ESC i:全切割
  • ESC J:以最小间距进行打印和进纸
  • ESC K:以最小间距进行打印和退纸
  • ESC l:选择或取消倒过来的字符
  • ESC m:局部切割
  • ESC o:印章
  • ESC p:产生指定脉冲
  • ESC q:释放纸
  • ESC r:选择打印颜色
  • ESC R:选择国际字符子集
  • ESC SP:设置右边界

如何在 node.js 中用发送 escpos 指定给打印机呢?GitHub 上有一个第三方库,非常方便,使用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const escpos = require('escpos')
const device = new escpos.USB()
const options = { encoding: "GB18030" }
const printer = new escpos.Printer(device, options)
device.open(function(){
printer
.font('a')
.align('ct')
.style('bu')
.size(1, 1)
.text('The quick brown fox jumps over the lazy dog')
.text('敏捷的棕色狐狸跳过懒狗')
.barcode('1234567', 'EAN8')
.qrimage('https://github.com/song940/node-escpos', function(err){
this.cut()
this.close()
})
})

其原理就是要用 net 模块创建一个 socket,连接到客户端,然后发送相应的小票打印指令,演示代码:

1
2
3
4
5
6
var net = require('net');
var client = new net.Socket();
var buffer; //Buffer类型,放你的打印指令,具体的小票打印指令可以搜索ESC/POS指令
client.connect(port, ip, function () {
client.write(buffer, function(){});
});