Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否通过ESC/POS热敏打印机打印二维码?_Ruby_Printing_Barcode_Qr Code_Zebra Printers - Fatal编程技术网

Ruby 是否通过ESC/POS热敏打印机打印二维码?

Ruby 是否通过ESC/POS热敏打印机打印二维码?,ruby,printing,barcode,qr-code,zebra-printers,Ruby,Printing,Barcode,Qr Code,Zebra Printers,我正在打印一些QR码(来自Ruby脚本),将ESC/POS命令写入Epson TM-T20热敏打印机 顺便说一句,我正在编写一个简单的ESC/POS命令打印机“驱动程序”。 我使用的打印机是Epson TM-T20(USB接口) 我正在Windows 7主机上使用serialport gem进行一些测试 关于为打印格式化文本和线性条形码编写ESC/POS命令,一切都很好,但我在理解打印QR代码的命令协议时遇到问题,使用爱普生提供的唯一可用文档(据我所知),请参阅: 现在,关于QRCodes命令的

我正在打印一些QR码(来自Ruby脚本),将ESC/POS命令写入Epson TM-T20热敏打印机

顺便说一句,我正在编写一个简单的ESC/POS命令打印机“驱动程序”。 我使用的打印机是Epson TM-T20(USB接口) 我正在Windows 7主机上使用serialport gem进行一些测试

关于为打印格式化文本和线性条形码编写ESC/POS命令,一切都很好,但我在理解打印QR代码的命令协议时遇到问题,使用爱普生提供的唯一可用文档(据我所知),请参阅:

现在,关于QRCodes命令的部分对我来说相当模糊,我无法解释请求的字节序列;相反,我发现尼古拉斯的例子非常有用:

通过破解那个有用的字节码示例,我能够成功打印二维码,请参见:

然而,总的来说,我对ESC/POS消息格式感到困惑,尤其是在我将在二维码中插入一条长文本消息(>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
def test\u qrcode(打印机、文本、打印也\u text=false、qr\u 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我不熟悉ESC/POS,但我确实有一些二维码的经验

如果您在二维码中输入的字符数达到上限,可能是二维码设计中固有的四个因素造成的:

  • 您可以控制纠错数据的数量。更多的错误纠正意味着更大的二维码,但更可靠的扫描

  • 二维码必须是方形的,所以您可能会遇到打印机固件的“最大宽度”和“最小二维码像素大小”限制

  • 二维码在中定义,每个版本代表一系列尺寸(版本越高,二维码越大)。您的打印机固件可能不支持高于某个数字的版本

  • QR码支持四种不同的编码,每种编码都有不同的数据限制(数字、字母数字、二进制和汉字)

  • 这意味着您应该:

  • 检查您正在进行的错误更正量。(从大到小,级别分别为
    H
    Q
    M
    L
    )。您可能会发现,较低级别的错误更正仍然可以提供足够的可靠性,同时允许您压缩更多数据

  • 检查规格,看看你是否可以要求更小的二维码像素,以便更宽的二维码可以放在纸上

  • 检查打印机支持的最高二维码版本

  • 检查您正在使用的数据编码


  • 如果您达到了400个字符左右的限制,最大版本应该在数字的
    8-13
    范围内,字母数字的
    11-17
    范围内,二进制的
    13-21
    范围内,具体取决于所使用的纠错级别。(参见前面链接的I)

    我找到的有关ESC/POS命令集的最完整文档如下:

    最近,我在POS客户端添加了二维码功能。 我发现打印出来非常有用,特别是对于调试打印的序列

    我的例子是用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)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (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)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (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, (byte)0x28, (byte)0x6b, store_pL, store_pH, (byte)0x31, (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)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (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();
    }
    
    这是在ESC/POS中:

    GS "(k"  4 0 49 65 50 0
    GS "(k"  3 0 49 67  5
    GS "(k"  3 0 49 69 48 
    GS "(k" 28 0 49 80 48 "https://stackoverflow.com/"
    GS "(k"  3 0 49 81 48
    

    我用Python创建这个库是为了与TM-T20通信。您可以使用“打印图像”命令打印二维码。我想代码可以很容易地翻译成Ruby。我知道!我已经在六月份重播给你了,这里::-)链接现在被修复了@这不是打印二维码,而是打印一些奇怪的字母,然后是字符串格式的url。有什么原因吗?@Kerroker当我使用错误的编码时,请检查您是否正在强制转换到另一种编码类型(例如UTF),并正确使用没有填充的代码页437。您正在使用的打印机驱动程序也可能自动执行此编码转换。@Tobia有多个QR命令,请查看此页的第一个命令。其余的在左侧的文档菜单中@LeoColman奇怪的字母是ESC/P代码,字符串是。。。好的,要呈现的字符串。这意味着特定打印机不支持
    GS(k
    QR码打印。