2014-05-10 46 views
6

Sto stampando alcuni codici QR (da uno script Ruby) scrivendo comandi ESC/POS su una stampante termica Epson TM-T20.stampa codici QR tramite una stampante termica ESC/POS?

BTW, sto scrivendo un semplice "driver" stampante comandi ESC/POS. La stampante Sto utilizzando un Epson TM-T20 (interfaccia USB) Sto facendo alcuni test da un host di Windows 7, usando la gemma serialport.

All fine di scrivere comandi ESC/POS per la stampa in formato testo e anche codici a barre lineari, ma ho problemi uinderstanding il protocollo di comando per stampare i codici QR, utilizzando l'unica documentazione disponibile supplyied da Epson (per quanto ne so), vedi: http://www.novopos.ch/client/EPSON/TM-T20/TM-T20_eng_qr.pdf

Ora, la sezione relativa ai comandi di QRCodes è per me piuttosto oscura e non sono stato in grado di interpretare le sequenze di byte richieste; invece ho trovato molto utile esempio che ho trovato qui: https://code.google.com/p/python-escpos/wiki/Usage

Hacking che bytecode utili ad esempio, sono in grado di successuffly codici QR di stampa, vedere:
Ho https://twitter.com/solyarisoftware/status/464740233008132096

Tuttavia, in generale, i' Nicolas m confuso sul formato di messaggio ESC/POS, specialmente nel caso inserissi un lungo messaggio di testo (> 400 caratteri) all'interno di un codice QR ... Sembra che la stampante rifiuti (non stampi) i codici QR contenenti più di 400 caratteri usando questo codice:

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 

Does som eone può suggerire una CLEAR ESC/POS DOCUMENTATION riguardante i comandi ESC/POS (= sequenze bytecodes) per stampare QRCodes (comandi ESC/POS codice bidimensionale)?

+0

ho fatto questa libreria in Python per comunicare con un TM-T20 . https://github.com/benoitguigal/python-epson-printer. Puoi usare il comando print_image per stampare il tuo codice QR. Il codice può essere facilmente tradotto in Ruby, credo. –

+0

Lo so! e ti ho già riprodotto a giugno, qui: http://www.raspberrypi.org/forums/viewtopic.php?p=562202#p562202 :-) –

risposta

1

Non ho familiarità con ESC/POS, ma ho qualche esperienza con i codici QR.

Se si sta colpendo un limite superiore al numero di caratteri che si possono mettere in un codice QR, ci sono quattro cose inerenti alla progettazione codice QR che potrebbero essere causa di esso:

  1. Puoi controllare la quantità di dati di correzione dell'errore. Più correzione degli errori significa un codice QR più grande ma una scansione più affidabile.

  2. I codici QR devono essere quadrati in modo da evitare i limiti di "larghezza massima" e "dimensione pixel minima del codice QR" del firmware della stampante.

  3. I codici QR sono definiti in "versions" con ciascuna versione che rappresenta una gamma di dimensioni (maggiore è la versione, maggiore è il codice QR). Il firmware della tua stampante potrebbe non supportare le versioni al di sopra di un certo numero.

  4. I codici QR supportano quattro diverse codifiche con limiti di dati diversi su ciascuna (Numerico, Alfanumerico, Binario e Kanji).

Questo significa che è necessario:

  1. controllare quanto la correzione degli errori si sta mettendo in (dal più al meno, i livelli sono H, Q, M, e L).. Potresti scoprire che un livello inferiore di correzione degli errori ti dà ancora abbastanza affidabilità mentre ti consente di spremere più dati.

  2. Controllare le specifiche per vedere se è possibile chiedere pixel di codice QR più piccoli in modo che sulla carta si inserisca un codice più ampio.

  3. Verificare quale è la versione di codice QR supportata più alta per la stampante.

  4. Verifica quale codifica dati stai utilizzando.

Se si sta colpendo un limite di circa 400 caratteri, la versione massima deve essere da qualche parte nel range 8-13 per numerico, 11-17 per alfanumerica, e 13-21 per binario, a seconda del livello di correzione degli errori utilizzato. (Vedere la reference table ho linkato prima)

10

La documentazione più completa che ho trovato per il comando/POS set ESC è questa: http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf

Recentemente, ho aggiunto la funzione di codice QR per un client POS. Ho trovato molto utile avere una stampa di questo Code page 437 reference, in particolare per il debug di una sequenza che è stata stampata.

Il mio esempio è in Java, ma è possibile ottenere l'idea:

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

Il link è rotto! – RBz

+1

Il collegamento ora è riparato! –

+0

Grazie mille !! Finalmente, un codice sorgente che funziona! –

-1

Questo è in 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