我在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,否则它不会在纸卷上输出。
答案 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()
。