首页 > 解决方案 > 为什么我需要将第二个文件写入 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,否则它不会在纸卷上输出。

标签: linuxgousbepson

解决方案


我要回答我自己的问题。最近几天,我用 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
}

推荐阅读