我正在打印一些QR码(来自
Ruby脚本),将ESC / POS命令写入Epson TM-T20热敏打印机.
顺便说一下,我正在编写一个简单的ESC / POS命令打印机“驱动程序”.
打印机我用的是Epson TM-T20(USB接口)
我正在使用serialport gem从Windows 7主机进行一些测试.
所有关于为打印格式化文本和线性条形码编写ESC / POS命令都很好,但我在使用Epson提供的唯一可用文档(据我所知)打印QR码时遇到问题,请参阅:http://www.novopos.ch/client/EPSON/TM-T20/TM-T20_eng_qr.pdf
现在,关于QRCodes命令的部分对我来说非常模糊,我无法解释所请求的字节序列;相反,我发现非常有用的尼古拉斯的例子我在这里找到:https://code.google.com/p/python-escpos/wiki/Usage
黑客那个有用的字节码示例,我能够成功地打印QR码,请参阅:
我https://twitter.com/solyarisoftware/status/464740233008132096
然而,总的来说,我对ESC / POS消息格式感到困惑,特别是如果我在QR码中插入长文本消息(> 400个字符)…似乎打印机拒绝(不打印)使用此代码包含超过400个字符的QR码:
def test_qrcode (printer,text,print_also_text=false,qr_size=6.chr) s = text.size + 3 lsb = (s % 256).chr msb = (s / 256).chr # https://code.google.com/p/python-escpos/wiki/Usage escpos = "" escpos << "\x1D\x28\x6B\x03\x00\x31\x43#{qr_size}" escpos << "\x1D\x28\x6B\x03\x00\x31\x45\x33" escpos << "\x1D\x28\x6B#{lsb}#{msb}\x31\x50\x30" escpos << text # escpos << "\x1D\x28\x6B\x03\x00\x31\x51\x30" # writing byte streams directly to the serial port printer.write escpos end
有人可以建议关于ESC / POS命令(=字节码序列)的CLEAR ESC / POS DOCUMENTATION来打印QRCodes(二维码ESC / POS命令)吗?
解决方法
我发现的ESC / POS命令集最完整的文档是这样的:
http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf
http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf
最近,我将QR码功能添加到POS客户端.
我发现打印出这个Code page 437 reference是非常有用的,特别是对于调试打印的序列.
我的例子是Java,但你可以得到这个想法:
public void print_qr_code(String qrdata) { int store_len = qrdata.length() + 3; byte store_pL = (byte) (store_len % 256); byte store_pH = (byte) (store_len / 256); // QR Code: Select the model // Hex 1D 28 6B 04 00 31 41 n1(x32) n2(x00) - size of model // set n1 [49 x31,model 1] [50 x32,model 2] [51 x33,micro qr code] // https://reference.epson-biz.com/modules/ref_escpos/index.PHP?content_id=140 byte[] modelQR = {(byte)0x1d,(byte)0x28,(byte)0x6b,(byte)0x04,(byte)0x00,(byte)0x31,(byte)0x41,(byte)0x32,(byte)0x00}; // QR Code: Set the size of module // Hex 1D 28 6B 03 00 31 43 n // n depends on the printer // https://reference.epson-biz.com/modules/ref_escpos/index.PHP?content_id=141 byte[] sizeQR = {(byte)0x1d,(byte)0x03,(byte)0x43,(byte)0x03}; // Hex 1D 28 6B 03 00 31 45 n // Set n for error correction [48 x30 -> 7%] [49 x31-> 15%] [50 x32 -> 25%] [51 x33 -> 30%] // https://reference.epson-biz.com/modules/ref_escpos/index.PHP?content_id=142 byte[] errorQR = {(byte)0x1d,(byte)0x45,(byte)0x31}; // QR Code: Store the data in the symbol storage area // Hex 1D 28 6B pL pH 31 50 30 d1...dk // https://reference.epson-biz.com/modules/ref_escpos/index.PHP?content_id=143 // 1D 28 6B pL pH cn(49->x31) fn(80->x50) m(48->x30) d1…dk byte[] storeQR = {(byte)0x1d,store_pL,store_pH,(byte)0x50,(byte)0x30}; // QR Code: Print the symbol data in the symbol storage area // Hex 1D 28 6B 03 00 31 51 m // https://reference.epson-biz.com/modules/ref_escpos/index.PHP?content_id=144 byte[] printQR = {(byte)0x1d,(byte)0x51,(byte)0x30}; // flush() runs the print job and clears out the print buffer flush(); // write() simply appends the data to the buffer write(modelQR); write(sizeQR); write(errorQR); write(storeQR); write(qrdata.getBytes()); write(printQR); flush(); }