写下这篇博客的原因:公司要求用树莓派驱动TSC打印机,在完成这个任务的过程中主要遇到了以下几个问题:
基于以上两个原因,我最后只好选择使用TSC打印机的指令集来驱动TSC打印机。
TSC打印机官网地址:TSC打印机
使用TSC打印指令集驱动TSC打印机原理:
在linux系统下,打印机使用USB接入后,会在/dev/usb/目录下,生成一个lp0文件,这个lp0文件就是TSC打印机的设备文件,要驱动TSC打印机就得向这个文件中写入TSC打印机指令集来打印指定打印内容。
TSC打印编程之前的测试:
既然知道了可以用指令集写入TSC打印机设备文件的方式,那么就得先熟悉TSC打印机指令,这里推荐使用官网的提供的DiagTool_V163工具进行测试,这个工具是windows系统下安装的,只是用来测试,需要安装官网提供的windows驱动:
通过这个工具,可以直接使用发送指令集(点击图中的通信工具)的方式与TSC打印机进行通信。
这里我有一个简单的使用这个工具,通过发送指令集来驱动TSC打印机的例子,供参考:
点击传送数据,即可驱动TSC打印机打印相关内容。
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 命令修改权限即可,但这种方式只能暂时修改权限,每次打印机重新连接就得重新执行这个命令,这里推荐这位博主的文章来进行永久权限修改:
永久修改权限
以上,就是树莓派使用指令集的方式驱动TSC打印机的全部内容,谢谢!
/dev/ttyUSB0 permission denied解决办法:https://blog.csdn.net/zbrj12345/article/details/79752221