为什么需要第二个文件写入golang中的pos打印机才能输出?

时间:2018-07-06 01:24:51

标签: linux go usb epson

我在Linux机器上有一台连接到USB端口的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,否则它不会在纸卷上输出。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的问题是您打电话

p.End()

之后

p.Readbyte()

虽然您应该先做。我相信您的打印机将“”(空格)视为无效命令,并自动完成前面的有效命令序列。

答案 2 :(得分:0)

看起来您已经在完成写入字节之前捕获了字节片。

p.Cut()

_,b:=p.Readbyte()

p.End()

从调用p.End()开始的字节永远不会添加到您的输出数据中,因此打印机将永远等待它……

example所示,应改为:

p.Cut()

p.End()

_,b:=p.Readbyte()

答案 3 :(得分:-1)

您必须执行f.Sync()。来自文档:Sync commits the current contents of the file to stable storage.https://golang.org/src/os/file_posix.go?s=3352:3379#L11)。在结束使用设备后,您可能需要执行f.Close()