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

Linux 为什么我需要向golang的pos打印机写入第二个文件才能输出?,linux,go,usb,epson,Linux,Go,Usb,Epson,我在Linux机器上有一台Epson TM-T88III pos打印机,连接在USB端口上。所有的工作都相对良好,它被识别出来,我可以打开设备,我可以在命令行上向打印机回显“Hello World”,它可以毫无问题地打印出来 然而,在golang中,当我用os.OpenFile打开设备并以字节片或字符串的形式写入一些测试序列时,它仅在我再次写入后打印该序列 如果我错过了我需要做的事情,有人能解释一下吗?我在golang是一个相对初学者,但我用其他语言编写程序 我的开场白是: f, err :=

我在Linux机器上有一台Epson TM-T88III pos打印机,连接在USB端口上。所有的工作都相对良好,它被识别出来,我可以打开设备,我可以在命令行上向打印机回显“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命令,并在byteslice中捕获它们(为此我使用panjjo的escpos包):

然后我将捕获的片b写入设备:

n,err:=f.Write(b)
if err != nil {
    panic(err)
}
在这一点上什么都没有发生,我花了一段时间才发现,如果我做最后一次:

f.WriteString(" ")
然后,所有的序列都会被打印出来,包括所有的样式、换行和剪切。 一切都很好,但不是没有最后的努力。 哦,是的,它确实需要空格或其他字符,写空字符串是行不通的


我还尝试编写一系列命令,而不是字节片,但我需要相同的第二个WriteString,否则它不会输出到纸卷上。

您必须执行
f.Sync()
。从文档:
Sync将文件的当前内容提交到稳定存储。
()。在您停止使用该设备后,您可能必须执行
f.Close()

您的问题是您需要调用

p.End()

之后

p.Readbyte()


而你应该先做。我认为您的打印机将“”(空格)视为无效命令,并自动完成前面的一系列有效命令。

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

p.Cut()

_,b:=p.Readbyte()

p.End()
调用
p.End()
的字节永远不会添加到输出数据中,因此打印机会一直等待它

如中所示,应改为:

p.Cut()

p.End()

_,b:=p.Readbyte()

我要回答我自己的问题。 最后几天,我在golang编写了自己的escpos实现。 一路上我学到了一些东西。 主要的是热敏打印机将自行决定缓冲什么以及如何缓冲。 这意味着您需要打开设备,在不缓冲的情况下向其写入命令

在github上的golang escpos包中(我认为这是不完整的),io.Writer用于流式传输命令。 相反,您需要使用*os.File并使用其写入方法将命令直接流式传输到打印机。 这在我的爱普生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
}

你能提供一些代码吗?完成添加了代码。不,这不起作用,我已经在写一个存储,这是一个大容量缓冲usb设备。f、 Sync()只是带有“Invalid Argument”的错误,而且我在源代码的前面延迟了一个f.Close。谢谢你的回答。我自己也看到了这一点,并且改变了这一点,这没有什么区别,因为问题的性质不同,请阅读我自己对问题的回答以寻求解决方案。我自己也看到了这一点,并改变了这一点,这没有什么区别,因为问题的性质不同,请阅读我对问题的回答以寻求解决方案
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
}