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