树莓派使用指令集驱动TSC打印机

写下这篇博客的原因:公司要求用树莓派驱动TSC打印机,在完成这个任务的过程中主要遇到了以下几个问题:

  • 官网提供TSC打印机的linux驱动只适用于x86_64,x86架构,树莓派是armV7架构
  • 官网提供的驱动TSC打印机的库都是.dll动态库,无法再linux系统下调用,且无法反编译

基于以上两个原因,我最后只好选择使用TSC打印机的指令集来驱动TSC打印机。

  1. TSC打印机官网地址:TSC打印机

  2. 使用TSC打印指令集驱动TSC打印机原理:
    在linux系统下,打印机使用USB接入后,会在/dev/usb/目录下,生成一个lp0文件,这个lp0文件就是TSC打印机的设备文件,要驱动TSC打印机就得向这个文件中写入TSC打印机指令集来打印指定打印内容。

  3. TSC打印编程之前的测试:
    既然知道了可以用指令集写入TSC打印机设备文件的方式,那么就得先熟悉TSC打印机指令,这里推荐使用官网的提供的DiagTool_V163工具进行测试,这个工具是windows系统下安装的,只是用来测试,需要安装官网提供的windows驱动:
    树莓派使用指令集驱动TSC打印机_第1张图片
    通过这个工具,可以直接使用发送指令集(点击图中的通信工具)的方式与TSC打印机进行通信。
    这里我有一个简单的使用这个工具,通过发送指令集来驱动TSC打印机的例子,供参考:
    树莓派使用指令集驱动TSC打印机_第2张图片

点击传送数据,即可驱动TSC打印机打印相关内容。

  1. 中文字符的打印实现:
    通过阅读TSC打印指令集文档后,我知道公司购买的打印机内的FLASH内存(2560KB)太小,无法存储中文字体(一般3000KB以上),因此虽然指令集文档中说明了有简体中文字体的支持,我也没办法使用。
    因此,为了解决这个中文字符打印的问题,仍然需要使用DiagTool_V163工具,通过这个工具,可以制作一个点阵型的字体,然后写入打印机中的FLASH即可使用中文字体,下面是我自己制作的一个微软雅黑字体:
    树莓派使用指令集驱动TSC打印机_第3张图片
    选择好要制作的字体之后,先点击“储存字形文件”来查看字体文件的大小(不能超过剩余的FLASH空间的大小),我的这个字体是2230KB,然后点击“传送字形文件”将字体写入打印机中,接下来就能够使用这个字体了:
    TEXT 100, 60, "字体名称“,0,1,1,2,”TSC打印机“
    PS:查看打印机FLASH剩余内存大小,可以点击“档案管理”,选择读取FLASH内存大小即可:
    树莓派使用指令集驱动TSC打印机_第4张图片
  2. Golang编程实现:
    打印机编程部分,我选择了自己熟悉的Go语言来进行编程,代码如下:
package tsc

import (
	"bufio"
	"bytes"
	"fmt"
	"golang.org/x/text/encoding/simplifiedchinese"
	"os"
	"printer"
	"strconv"
)

// TSC打印机设备文件路径
const DEV_FILE = "/dev/usb/lp0"

//const DEV_FILE = "/home/toothless/golang/src/tsc/logic.txt"

// 全局文件描述符
var gfd *os.File

// 向打印机发送TSC指令
func TSCSendCommand(comm string) {

	var buf bytes.Buffer

	// 1. 构建写入器
	writer := bufio.NewWriter(gfd)

	// 2. 构建字符串
	buf.WriteString(comm)
	buf.WriteString("\r\n")

	// 3. 输出最后的命令字符串
	str := buf.String()

	command, err := simplifiedchinese.GBK.NewEncoder().String(str)
	if err != nil {
		fmt.Println(err)
	}

	//codefmt := mahonia.NewDecoder("gbk2312")

	//command := codefmt.ConvertString(str)

	// 4. 写入命令
	if _, err := writer.WriteString(command); nil != err {
		fmt.Println("[WRITE ERROR]:", err)
		return
	}

	writer.Flush()

}

// 构建打印内容git clone --depth 1 https://github.com/golang/text.git
func TSCText(x, y, font, content string) string {

	var comm string = ""

	switch font {
	case "MicroFont":
		comm = "TEXT " + x + "," + y + "," + FormatString(font) + "," + "0,2,2,1" + "," + FormatString(content)
	default:
		comm = "TEXT " + x + "," + y + "," + FormatString(font) + "," + "0,1,1,1" + "," + FormatString(content)
	}

	return comm
}

// 构建条形码内容
func TSCBarcode(x, y, codeType, content string) string {
	// 1. 构建字符串
	comm := "BARCODE " + x + "," + y + "," + FormatString(codeType) + "," + "200,2,0,5,2" + "," + FormatString(content)

	return comm
}

// 执行打印
func TSCPrint(print_num int) {

	comm := "PRINT 1," + strconv.Itoa(print_num)

	TSCSendCommand(comm)
}

// 生成"string"格式的字符串
func FormatString(content string) string {
	return "\"" + content + "\""
}

// 打印机初始化设置:设定纸张大小SIZE,间隙GAP等
func TSCInit() {
	// 打开打印机设备文件
	if fd, err := os.OpenFile(DEV_FILE, os.O_RDWR|os.O_APPEND, 0666); nil != err {
		panic(err)
	} else {
		gfd = fd
	}

	TSCSendCommand("SIZE 3.94,5.91")
	TSCSendCommand("GAP 0.08, 0")
	TSCSendCommand("SPEED 4")
	TSCSendCommand("DIRECTION 1")
	TSCSendCommand("CLS")
}

// 结束一次打印
func TSCStop() {

	TSCSendCommand("EOP")

	gfd.Close()
}

测试代码如下:
func TestTacPrinter(t *testing.T) {
	TSCInit()

	comm := TSCText("120", "220", "MicroFont", "一起学编程")
	TSCSendCommand(comm)
	
	comm = TSCText("120", "340", "MicroFont", "好好学习,天天向上")
	TSCSendCommand(comm)

	comm = TSCBarcode("120", "800", "128", "58167667390")
	TSCSendCommand(comm)

	TSCPrint(2)
	
	TSCStop()
}

在实现打印机编程的过程中,会遇到/dev/usb/lp0 不可读写的情况,这个就直接使用:
sudo chmod 666 /dev/usb/lp0 命令修改权限即可,但这种方式只能暂时修改权限,每次打印机重新连接就得重新执行这个命令,这里推荐这位博主的文章来进行永久权限修改:
永久修改权限

  1. 树莓派驱动TSC打印机:
    Golang是支持跨平台编译的,因此只需要将go源码文件编译成arm平台可用的可执行文件,再放入树莓派中执行即可。具体编译命令如下:
    GOOS=linux GOARCH=amd64 go build tsc.go

以上,就是树莓派使用指令集的方式驱动TSC打印机的全部内容,谢谢!

/dev/ttyUSB0 permission denied解决办法:https://blog.csdn.net/zbrj12345/article/details/79752221

你可能感兴趣的:(Golang)