2014-05-10 733 views
6

我正在打印一些QR碼(來自Ruby腳本),將ESC/POS命令寫入Epson TM-T20熱敏打印機。通過ESC/POS熱敏打印機打印QR碼?

順便說一句,我正在寫一個簡單的ESC/POS命令打印機「驅動程序」。 我正在使用Epson TM-T20(USB接口)的打印機 我正在使用serialport gem從Windows 7主機進行一些測試。

關於爲打印格式化文本和線性條形碼編寫ESC/POS命令的所有問題,但是我使用愛普生提供的唯一可用文檔(據我所知),無法理解打印QR碼的命令協議,見:http://www.novopos.ch/client/EPSON/TM-T20/TM-T20_eng_qr.pdf

現在,他關於QRCodes命令的部分對我來說很模糊,我無法解釋請求的字節序列;相反,我發現非常有益的Nicolas的例子,我在這裏找到:https://code.google.com/p/python-escpos/wiki/Usage

黑客有用的字節碼例子,我能夠successuffly打印QR代碼,請參閱:
https://twitter.com/solyarisoftware/status/464740233008132096

不過,在一般情況下,我m對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命令)?

+0

我做在Python這個庫與TM-T20溝通。 https://github.com/benoitguigal/python-epson-printer。您可以使用print_image命令來打印您的QR碼。我猜可以很容易地將代碼翻譯成Ruby。 –

+0

我知道!我已經在6月份重播給你,在這裏:http://www.raspberrypi.org/forums/viewtopic.php?p=562202#p562202 :-) –

回答

1

我不熟悉ESC/POS,但是我對QR碼有一定的瞭解。

如果你打的,你可以把QR碼字符數的上限,也有QR碼設計中固有的四兩件事,這可能是導致它:

  1. 你可以控制糾錯數據量。更多的糾錯意味着更大的QR碼,但更可靠的掃描。

  2. QR碼必須是正方形的,所以您可能會碰撞打印機固件的「最大寬度」和「最小QR碼像素大小」限制。

  3. QR碼在"versions"中定義,每個版本代表一個尺寸範圍(版本越高,QR碼越大)。打印機的固件可能不支持特定數字以上的版本。

  4. QR碼支持四種不同數據限制的編碼(數字,字母數字,二進制和漢字)。

這就是說,你應該:

  1. 檢查多少糾錯你把在(從多到少,水平是HQML)。您可能會發現,較低的糾錯水平仍然可以提供足夠的可靠性,同時還可以擠入更多數據。

  2. 檢查規範,看看您是否可以要求更小的QR碼像素,以便更寬的代碼適合紙張。

  3. 檢查打印機支持的最高QR碼版本。

  4. 檢查您正在使用哪種數據編碼。

如果你打的大約400個字符的限制,最高版本應該是某處8-13範圍內的數字,11-17字母數字和13-21二進制,取決於糾錯的使用水平。 (見reference table我之前鏈接)

10

最完整的文檔,我發現了ESC/POS指令集是這個: 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)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(); 
} 
+0

鏈接被破壞! – RBz

+1

該鏈接現已修復! –

+0

非常感謝!最後,一個可行的源代碼! –

-1

這是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 
相關問題