7
votes

So I have been writing an Android app for a Bluetooth Printer for a while and I have realised that this is actually the ESC/POS standard: http://nicholas.piasecki.name/blog/wp-content/uploads/2009/12/ESC-POS-Command-Guide.pdf

Now the document I am using for my printer is a limited subset of these commands and can be found here: https://dl.dropboxusercontent.com/u/88265006/%E4%BA%A7%E5%93%81/Printer's%20user%20manual/SP-MP-300-Technical%20Manual.pdf

        private void initPrinter() {
            byte[] init = new byte[2];
            init[0] = 0x1B;
            init[1] = 0x40;
            mService.write(init);
        }

        private void printText(String message){
            byte[] send;
            try{
                send = message.getBytes("UTF8");
            }
            catch(UnsupportedEncodingException e){
                send = "Error".getBytes();
            }
            initPrinter();
            mService.write(send);
        }

I can connect to the printer, initialise it with an "ESC @" command and I can write with the above commands, but I cannot seem to get any of the "visual" effects in terms of ANY kind of barcode. This is my attempt for a 1D EAN13 code (0000000000000):

        byte[] height = new byte[3];
        height[0] = 0x1D;
        height[1] = 0x68;
        height[2] = (byte)30;
        //height[3] = 0;

        byte[] width = new byte[3];
        width[0] = 0x1D;
        width[1] = 0x77;
        width[2] = (byte)3;

        byte[] textPos = new byte[3];
        textPos[0] = 0x1D;
        textPos[1] = 0x48;
        textPos[2] = (byte)2;

        byte[] level = new byte[3];
        level[0] = 0x1D;
        level[1] = 0x51;
        level[2] = (byte)32;

        byte[] code = new byte[18];
        code[0] = 0x1D;
        code[1] = 0x6B;
        code[2] = 0x02;
        code[3] = 0x0D;
        code[4] = 0x30;//1
        code[5] = 0x30;//2
        code[6] = 0x30;//3
        code[7] = 0x30;//4
        code[8] = 0x30;//5
        code[9] = 0x30;//6
        code[10] = 0x30;//7
        code[11] = 0x30;//8
        code[12] = 0x30;//9
        code[13] = 0x30;//10
        code[14] = 0x30;//11
        code[15] = 0x30;//12
        code[16] = 0x30;//13

        code[17] = 0x00;//end
        mService.write(height);
        mService.write(width);
        mService.write(textPos);
        mService.write(level);
        mService.write(code);

Where mService actually writes the data. The best output I get is 0█0█0█0█0█0█0█0█0█0█0█0█0█0█ - after sending the data many times in a row.

If I remove the final end byte after multiple sends I get 14 0's, and I have also tried adding an ending 0 to the height, width, textPosition and level arrays, with no affect.

I have also looked in the following places: http://www.manualslib.com/manual/689542/Axiohm-A795.html?page=91
http://pyramidacceptors.com/phoenix-printer/esc-pos-command-set/
http://www.vbforums.com/showthread.php?754493-RESOLVED-Printing-Barcode-with-ESC-POS-on-Epson-Printers
http://www.manualslib.com/manual/753647/Axiohm-A630.html?page=51
https://www.sparkfun.com/datasheets/Components/General/Driver%20board.pdf
Where can I find a "ESC/POS" Epson Barcode Test Program?

1
Are you sure you are casting your bytes correctly. Java has a weird way of hex to byte(binary conversion). This might be what is leading to your problem.SeahawksRdaBest
I ended up creating constants for ease of reading, e.g. private static byte GS = 0x1d; But Java's byte representation was not the issue, but thank you for trying to help :)Quintin Balsdon

1 Answers

5
votes

Ok so it turns out that in ESC/POS the printer actually calculates some of the data for you. I should not have been putting the check byte (the last digit of the actual bar code) in the data I was sending to the print.

Of course it did not help that my documentation is missing all the <= signs. I ended up using this document for help: http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf

I am still working on the QR Code printing but I am quite certain my problems are somewhat similar.