MOXUY

Aug 25, 2020

在Electron中使用escpos

前言

最近有个需求是需要在收银系统内连接热敏打印机和一体机的客显,因为项目中使用了electron进行开发并发布到Windows,所以就在网上找了下解决方案。
经过一番搜索,发现了一个node-escpos库,但是相关开发资料比较少就只能自己摸索了。

热敏打印机

这块比较好对接,安装好相关依赖(escposescpos-usb)后,需要使用electron-rebuild重建,因为其中使用到了一个原生模块(usb)。

安装完成之后只需按照例子中操作即可打印出小票

客显

对接这块时,一般产品会提供一个escpos指令文档,只要按照文档上的指令给设备发送指令即可,但重要是怎么发送。
在我的项目中使用到了escpos-serialport模块。
使用以下代码连接串口

1
2
3
4
5
6
7
8
9
10
11
const options = {
baudRate: 2400, // 波特率,一般是这个
autoOpen: false // 不自动打开
};
const device = new window.escpos.Serial(
"COM1", // 串口名,根据具体设备来
{ ...options }
);
device.open(() => {
// 串口连接成功
});

连接串口成功之后即可向指定串口发送指令集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 我这台机器的指令文档如下
// 1.ESC @初始化命令
// ASCII码 格式:ESC @
// 十进制 格式:[027][064]
// 十六进制 格式:[1BH][40H]
// 说明:恢复到上电开机时的状态。

// 2.CLR清屏命令
// ASCII码 格式:CLR
// 十进制 格式:[012]
// 十六进制 格式:[0CH]
// 说明:清除屏幕上的所有字符。

// 3.ESC Q A d1d2d3…dn CR送显示数据命令
// ASCII码 格式:ESC Q A d1d2d3…dn CR
// 十进制 格式:[027][081][065]d1d2d3…dn[013] 48<=dn<=57或dn=45或dn=46
// 十六进制 格式:[1BH][51H][41H]d1d2d3…dn[0DH]
// 30H<=dn<=39H或dn=2DH或dn=2EH
// 说明:
// a.执行该命令时,会以覆盖模式送要显示的数据,这样就不需要在每次送显示数据前都去执行CAN清除光标行命令了。
// b.显示的d1…dn没有小数点时1<=n<=8。
// c.显示的d1…dn有小数点时1<=n<=15(8位数值+7位小数点)。
// d.显示的内容可用CLR或CAN命令清除。

// 4.ESC s n设置 “单价”、“总计”、“收款”、“找零”字符显示状态命令
// ASCII码 格式:ESC s n 0<=n<=4
// 十进制 格式:[027][115] n 48<=n<=52
// 十六进制 格式:[1BH][73H] n 30H<=n<=34H
// 说明:(1)当 n=0,四种灯 全暗。
// (2)当 n=1,“单价”灯 亮,其它三种 暗。
// (3)当 n=2,“总计”灯 亮,其它三种 暗。
// (4)当 n=3,“收款”灯 亮。其它三种 暗。
// (5)当 n=4,“找零”灯 亮。其它三种 暗。

device.write(`${String.fromCodePoint(27)}${String.fromCodePoint(64)}`) // 初始化命令,这里需要用到fromCodePoint
device.write(`${String.fromCodePoint(12)}`) // 清屏命令

const price = 123123.1; // 显示的价格(8位数值或者7位数值+小数点)
device.write(`${String.fromCodePoint(27)}${String.fromCodePoint(81)}${String.fromCodePoint(65)}${price}${String.fromCodePoint(13)}`) // 设置价格
tags: Electron
OLDER > < NEWER