linux - 为什么我需要将第二个文件写入 golang 中的 pos 打印机才能输出?
问题描述
我有一台连接在 USB 端口上的 Linux 机器上的 Epson TM-T88III pos 打印机。一切工作相对良好,它被识别,我可以打开设备,我可以在命令行上向打印机回显“Hello World”,它可以毫无问题地打印。
但是在 golang 中,当我使用 os.OpenFile 打开设备并将一些测试序列写入字节片或字符串时,它只会在我进行另一次写入后打印该序列。
如果我错过了我需要做的事情,有人可以解释一下吗?我是 golang 的相对初学者,但我会用其他语言编程。
我打开:
f, err := os.OpenFile("/dev/usb/lppos",os.O_RDWR,0755)
if err != nil {
panic(err)
}
defer f.Close()
然后我定义了一些 esc 命令并在字节片中捕获它们(为此我使用 panjjo 的 escpos 包):
p := escposc.New()
p.Init()
p.SetSmooth(1)
p.SetFontSize(2, 3)
p.SetFont("A")
p.Write("test ")
p.SetFont("B")
p.Write("test2 ")
p.Formfeed()
p.SetFont("B")
p.SetFontSize(1, 1)
p.SetEmphasize(1)
p.Write("halle")
p.Formfeed()
p.SetUnderline(1)
p.SetFontSize(4, 4)
p.Write("halle")
p.SetReverse(1)
p.SetFontSize(2, 4)
p.Write("halle")
p.Formfeed()
p.FormfeedN(5)
p.Cut()
_,b:=p.Readbyte()
p.End()
然后我将捕获的切片 b 写入设备:
n,err:=f.Write(b)
if err != nil {
panic(err)
}
在这一点上什么都没有发生,我花了一段时间才发现如果我做最后一个:
f.WriteString(" ")
然后所有序列都按原样打印,包括所有样式、换行和剪切。一切都很好,但不是没有最后一个 WriteString。哦,是的,它确实需要空格或其他字符,写一个空字符串是行不通的。
我还尝试编写一串命令而不是字节片,但我需要相同的第二个 WriteString,否则它不会在纸卷上输出。
解决方案
我要回答我自己的问题。最近几天,我用 golang 编写了自己的 escpos 实现。一路上我学到了一些东西。主要的是热敏打印机将自行决定要缓冲什么以及如何缓冲。这意味着您需要打开设备并且不缓冲您向其写入命令。
在 github 上的 golang escpos 包中(在我看来,它是不完整的)io.Writer 用于流式传输命令。取而代之的是,您需要使用 *os.File 并使用其 Write 方法将命令直接流式传输到打印机。这可以在我的 Epson TM-T88III 热敏打印机上立即运行且完美无缺。
基本上我更改了 escpos 代码的以下核心:
type Escpos struct {
enc *encoding.Encoder
w io.Writer
}
func NewEscpos(w io.Writer) *Escpos {
return &Escpos{
enc: charmap.CodePage437.NewEncoder(),
w: w,
}
}
func (e *Escpos) write(b []byte) error {
_, err := e.w.Write(b)
return err
}
在这个新代码中,我可以打开一个设备并将指向文件句柄的指针作为 Escpos 类型引用的参数,当命令序列完成后,我可以关闭设备。同时它输出收据和我想要的打印。
type Escpos struct {
enc *encoding.Encoder
f *os.File
}
func NewEscpos(f *os.File) *Escpos {
return &Escpos{
enc: charmap.CodePage437.NewEncoder(),
f: f,
}
}
func (e *Escpos) write(b []byte) error {
_, err := e.f.Write(b)
return err
}
推荐阅读
- javascript - 在 View Angular 5 中使用 JS 对象值
- styles - OpenLayers 仅将样式应用于道路的一部分
- php - 检查给定区域/坐标内的点的算法
- codeigniter - 无法从完整路径回显图像
- python - 如何在 shell 命令行上传递带引号的多行字符串?
- python - 当有许多其他实例时,只打印一个实例
- entity-framework-core - 在实体框架核心 IQueryable 上的“任何”中使用“任何”
- c# - 导航后如何更改页面标题
- php - 想根据列拆分MySql-query的结果
- c - 如果二进制搜索的数字不在索引中,如何返回 NULL?