android pos机打印开发
2016-11-05 13:13:44 wan_ing 阅读数 2012

    研究了好几天的pos机打印,终于搞好了,在此做个笔记。第一次写博客 ,如有不对,望提出。

 由于pos机可打印多种类型图片,我打印的是光栅位图,另外pos机也可打印其他多种类型图片,在此只说明光栅位图的打印。
  
  给pos机传的都是16进制,所以以下指令都是16进制的字符串。
  先贴出我用到的打印机指令:
  
String MIDDLE="1B 61 01"; //居中
String LEFT="1B 61 00";  //靠左
String LINE="0A";  //换行


 居中、靠左、换行这几个指令对于文本和图片都是可用的

 下面是打印光栅位图的指令:

String i1 = "1D";
String i2 = "76";
String i3 ="30";
String i4 ="00" ; 
String xL;
String xH;
String yL;
String yH;

以上指令中:i4值可 根据需求制定:0普通模式,1倍宽模式,2倍高模式,3四倍大小

                   xL+xH*256=图片的宽/8  

                  yL+yH*256=图片的高

为什么这里宽要除8呢?  

一个像素点需要把自己的信息传递给pos机,信息中1代表打印 0代表不打印,而1byte=8bit;一个像素点是一个byte; 需要用8位二进制传递信息,传给打印机的时候8位二进制会转成高位和低位的十六进制.

对于这个的理解我也不是很透彻,还不太理解的自行百度.


有了以上指令就可以pos机打印啦 直接贴代码

打印文本: 

StringBuffer sb=new StringBuffer();

sb.append(MIDDLE).append(title).append(LINE)
        .append(LEFT).append(name).append(LINE)
        .append(time).append(LINE)
        .append(money).append(LINE);

以上代码居中命令在需要居中的文本之前调用,靠左只需调用一次,pos机默认靠左, title,name,time,money是需要打印的信息 这些信息也是需要转成十六进制滴

文本信息转十六进制代码:

/**
 * 字符串转换为16进制字符
 */

public  static String str2HexStr(String str){

    char[] chars = "0123456789ABCDEF".toCharArray();
    StringBuilder sb = new StringBuilder("");
    byte[] bs = new byte[0];
    try {
        bs = str.getBytes("GBK");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    int bit;

    for (int i = 0; i < bs.length; i++)
    {
        bit = (bs[i] & 0x0f0) >> 4;    
        sb.append(chars[bit]);
        bit = bs[i] & 0x0f;  
        sb.append(chars[bit]);
        sb.append(' ');
    }
    return sb.toString().trim();
}

通过以上就拿到文本的16进制字符串,当然打印机需要的是16进制字节, 16进制字符串转16进制byte数组代码在文章最后


打印图片:

//打印机打印图片指令  xl+xh*256= yl+yh*256=int width= bitmap.getWidth()/8;
int height=bitmap.getHeight();

int   xl=width%256;  //低位取余 高位取商
int   xh=width/256;

int   yl=height%256;  
int   yh=height/256;

xl,xh,yl,yh在这里还是十进制的 需要转成十六进制, 十进制转十六进制代码:

//10进制转16进制
public static String IntToHex(int n){
        char[] ch = new char[20];
        int nIndex = 0;
        while ( true ){
            int m = n/16;
                int k = n%16;
                if ( k == 15 )
                       ch[nIndex] = 'F';
                else if ( k == 14 )
                        ch[nIndex] = 'E';
                else if ( k == 13 )
                        ch[nIndex] = 'D';
                else if ( k == 12 )
                        ch[nIndex] = 'C';
               else if ( k == 11 )
                        ch[nIndex] = 'B';
                else if ( k == 10 )
                        ch[nIndex] = 'A';
                else
                    ch[nIndex] = (char)('0' + k);
               nIndex++;
                if ( m == 0 )
                        break;
                n = m;
            }
        StringBuffer sb = new StringBuffer();
        sb.append(ch, 0, nIndex);
        sb.reverse();
        String result=sb.toString();
    if(result.length()==1){
        result="0"+result;
    }

        return result;
    }

现在打印图片的头指令有了,后面再加上图片的数据就可以了  图片转byte :

   public static byte[] sendBWImage(Bitmap img, Context ctx) {
        int width = img.getWidth();         //获取位图的宽
        int height = img.getHeight();       //获取位图的高

        int[] pixels = new int[width * height]; //通过位图的大小创建像素点数组
        img.getPixels(pixels, 0, width, 0, 0, width, height);
        int[] gray=new int[height*width];

        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                int grey = pixels[width * i + j];
                int red = ((grey  & 0x00FF0000 ) >> 16);
                gray[width*i+j]=red;

            }
        }

        //551
        int e=0;
        int byteLen = width/8;
        byte[] result=new byte[byteLen*height];
        int k=0;
        for (int i = 0; i < height; i++) {
            byte[] bt = new byte[byteLen];
            for (int j = 0; j < width; j++) {
                int g=gray[width*i+j];
                int byteIndex = j/8;
                int bitIndex = j%8;
                if (g>=128) {
                    pixels[width*i+j]=0xffffffff;
                    e=g-255;
                }else {
                    pixels[width*i+j]=0xff000000;
                    if(j < byteLen*8){
                        bt[byteIndex] += 1<<(7-bitIndex);
                    }
                    e=g-0;
                }

                if (j<width-1&&i<height-1) {//右边像素处理
                    gray[width*i+j+1]+=3*e/8; //                    gray[width*(i+1)+j]+=3*e/8;//右下
                    gray[width*(i+1)+j+1]+=e/4;
                }else if (j==width-1&&i<height-1) {//靠右或靠下边s的像素的情况
                    //下方像素处理
                    gray[width*(i+1)+j]+=3*e/8;
                }else if (j<width-1&&i==height-1) {
                    //右边像素处理
                    gray[width*(i)+j+1]+=e/4;
                }
            }
            for(int m=0;m<bt.length;m++){
                result[k++]=bt[m];
            }
        }
        
        Bitmap mBitmap=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        mBitmap.setPixels(pixels, 0, width, 0, 0, width, height);
//        ImageUtils.saveMyBitmap("0001", mBitmap);

        return result;
    }


现在头指令和图片数据都有了 怎么把String类型的16进制和byte类型的结合在一起呢?

16进制字符串转byte数组代码:

/**
 * 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" –> byte[]{0x2B, 0×44, 0xEF,
 * 0xD9}
 *
 * @param src
 *            String
 * @return byte[]
 */
public static byte[] HexString2Bytes(String src) {
    if (null == src || 0 == src.length()) {
        return null;
    }
    byte[] ret = new byte[src.length() / 2];
    byte[] tmp = src.getBytes();
    for (int i = 0; i < (tmp.length / 2); i++) {
        ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
    }
    return ret;
}
/**
 * 将两个ASCII字符合成一个字节; 如:"EF"–> 0xEF
 *
 * @param src0
 *            byte
 * @param src1
 *            byte
 * @return byte
 */
public static byte uniteBytes(byte src0, byte src1) {
    byte _b0 = Byte.decode("0x" + new String(new byte[] {src0})).byteValue();
    _b0 = (byte) (_b0 << 4);
    byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();
    byte ret = (byte) (_b0 ^ _b1);
    return ret;
}

把16进制字节发给打印机就ok了.


第一次写博客 排版可能不太好  望谅解 有不对的地方多谢指出.




2015-04-17 13:43:50 sdvch 阅读数 7404

上一篇文章结束了ESC/POS的指令集,没看过的可以去看一下,可以当作工具文档来使用的

android 控制POS机图文打印(一)

这一篇正式介绍如何使用POS机来打印图文信息。

首先介绍一下,ESC/POS指令是如何使用的,

字体加粗指令:

byte[] FONT_B =new byte[3];

FONT_B[0] = 27;

FONT_B[1] = 33;

FONT_B[2] = 8;

字体纵向放大一倍:

byte[] CLEAR_FONT =new byte[3];

CLEAR_FONT[0] = 0x1c;

CLEAR_FONT[1] = 0x21;

CLEAR_FONT[2] = 0;

清除字体放大指令:

byte[] FD_FONT =new byte[3];

FD_FONT[0] = 0x1c;

FD_FONT[1] = 0x21;

FD_FONT[2] = 4;

打印条形码指令:

byte[] PRINT_CODE =new byte[9];

PRINT_CODE[0] = 0x1d;

PRINT_CODE[1] = 0x68;

PRINT_CODE[2] = 120;

PRINT_CODE[3] = 0x1d;

PRINT_CODE[4] = 0x48;

PRINT_CODE[5] = 0x10;

PRINT_CODE[6] = 0x1d;

PRINT_CODE[7] = 0x6B;

PRINT_CODE[8] = 0x02;

等等的指令使用。。。

可以参考下上一篇文章的指令集来进行设置。其中,ESC/POS指令是可以进行十进制和十六进制的设定的,这个大家要注意了。

接下来是介绍如何连接到打印机。

private static StringPRINT_IP = "192.168.1.111";// 打印机IP地址

private staticint PRINT_PORT = 9100;// 打印机端口 默认为9100 建议不要修改打印机端口,修改了可能会连接不上的

这里设定了打印机的IP地址和端口,其中,端口号为9100是打印机默认的设置,最好就不要去修改,如果修改了,可能导致连接不上的,我一开始的时候设置了9000,就连接不上了。。。

然后就通过socket进行连接打印机

// 建立打印机连接

socket = new Socket();

InetSocketAddress iSocketAddress = new InetSocketAddress(PRINT_IP, PRINT_PORT);// 绑定打印机

socket.connect(iSocketAddress);// 建立连接

接下来就是写一个打印的方法,调用打印机传输指令和数据到打印机进行打印。

直接上代码了,代码里面的注释得非常清楚

  1. /** 
  2.      * @param PRINT_DATA 
  3.      *            小票主要数据 
  4.      * @param GS_INFO 
  5.      *            小票附带信息 
  6.      * @param CAIDAN_SN 
  7.      *            小票号码 
  8.      */  
  9.     public void print(List<Map<String, Object>> PRINT_DATA,Map<String, String> GS_INFO, String CAIDAN_SN) {  
  10.         if (PRINT_DATA != null && PRINT_DATA.size() > 0) {  
  11.         try {  
  12.             // 条码打印指令  
  13.             byte[] PRINT_CODE = new byte[9];  
  14.             PRINT_CODE[0] = 0x1d;  
  15.             PRINT_CODE[1] = 0x68;  
  16.             PRINT_CODE[2] = 120;  
  17.             PRINT_CODE[3] = 0x1d;  
  18.             PRINT_CODE[4] = 0x48;  
  19.             PRINT_CODE[5] = 0x10;  
  20.             PRINT_CODE[6] = 0x1d;  
  21.             PRINT_CODE[7] = 0x6B;  
  22.             PRINT_CODE[8] = 0x02;  
  23.   
  24.             // 清除字体放大指令  
  25.             byte[] FD_FONT = new byte[3];  
  26.             FD_FONT[0] = 0x1c;  
  27.             FD_FONT[1] = 0x21;  
  28.             FD_FONT[2] = 4;  
  29.               
  30.             // 字体加粗指令  
  31.             byte[] FONT_B = new byte[3];  
  32.             FONT_B[0] = 27;  
  33.             FONT_B[1] = 33;  
  34.             FONT_B[2] = 8;  
  35.               
  36.             // 字体纵向放大一倍  
  37.             byte[] CLEAR_FONT = new byte[3];  
  38.             CLEAR_FONT[0] = 0x1c;  
  39.             CLEAR_FONT[1] = 0x21;  
  40.             CLEAR_FONT[2] = 0;  
  41.               
  42.             // 计算合计金额  
  43.             int price = 0;  
  44.               
  45.             // 初始化打印机  
  46.             socketOut.write(27);  
  47.             socketOut.write(64);  
  48.             socketOut.write(FD_FONT);// 字体放大  
  49.             socketOut.write(FONT_B);// 字体加粗  
  50.             socketOut.write(10);  
  51.             writer.write("  " + GS_INFO.get("GS_Name") + " \r\n");  
  52.             writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效  
  53.   
  54.             socketOut.write(CLEAR_FONT);  
  55.             socketOut.write(10);  
  56.             writer.write("NO: " + CAIDAN_SN + " \r\n");  
  57.             writer.write("------------------------------\r\n");  
  58.             writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "\r\n");  
  59.             writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n");  
  60.             writer.write("联系电话: " + GS_INFO.get("GS_tel") + " \r\n");  
  61.             writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "\r\n");  
  62.             writer.write("------------------------------\r\n");  
  63.             writer.write(Fix_String_Lenth(1,Colum_Name[0], 4)  
  64.                     + Fix_String_Lenth(0,Colum_Name[1], 14)  
  65.                     + Fix_String_Lenth(1,Colum_Name[2], 4)  
  66.                     + Fix_String_Lenth(1,Colum_Name[3], 6) + "\r\n");  
  67.             for (int i = 0; i < PRINT_DATA.size() - 1; i++) {  
  68.                 writer.write(Fix_String_Lenth(1,i + 1 + ""2)  
  69.                         + Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14)  
  70.                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4)  
  71.                         + Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + "\r\n");  
  72.                 price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());  
  73.             }  
  74.               
  75.             // 打印二维码  
  76.             Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima");  
  77.               
  78.             byte[] data = new byte[] { 0x1B0x330x00 };  
  79.             socketOut.write(data);  
  80.             data[0] = (byte)0x00;  
  81.             data[1] = (byte)0x00;  
  82.             data[2] = (byte)0x00;    //重置参数  
  83.               
  84.             int pixelColor;  
  85.               
  86.             // ESC * m nL nH 点阵图  
  87.             byte[] escBmp = new byte[] { 0x1B0x2A0x000x000x00 };  
  88.               
  89.             escBmp[2] = (byte)0x21;  
  90.               
  91.             //nL, nH    
  92.             escBmp[3] = (byte)(bmp.getWidth() % 256);  
  93.             escBmp[4] = (byte)(bmp.getWidth() / 256);  
  94.               
  95.             // 每行进行打印  
  96.             for (int i = 0; i < bmp.getHeight()  / 24 + 1; i++){  
  97.                 socketOut.write(escBmp);  
  98.                   
  99.                 for (int j = 0; j < bmp.getWidth(); j++){  
  100.                     for (int k = 0; k < 24; k++){  
  101.                         if (((i * 24) + k) < bmp.getHeight()){  
  102.                             pixelColor = bmp.getPixel(j, (i * 24) + k);  
  103.                             if (pixelColor != -1){  
  104.                                 data[k / 8] += (byte)(128 >> (k % 8));  
  105.                             }  
  106.                         }  
  107.                     }  
  108.                       
  109.                     socketOut.write(data);  
  110.                     // 重置参数  
  111.                     data[0] = (byte)0x00;  
  112.                     data[1] = (byte)0x00;  
  113.                     data[2] = (byte)0x00;  
  114.                 }  
  115.                 //换行  
  116.                 byte[] byte_send1 = new byte[2];  
  117.                 byte_send1[0] = 0x0d;  
  118.                 byte_send1[1] = 0x0a;  
  119.                 socketOut.write(byte_send1);  
  120.             }  
  121.               
  122.             //换行  
  123.             byte[] byte_send2 = new byte[2];  
  124.             byte_send2[0] = 0x0d;  
  125.             byte_send2[1] = 0x0a;  
  126.             //发送测试信息   
  127.             socketOut.write(byte_send2);  
  128.               
  129.             writer.write("------------------------------\r\n");  
  130.             writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元\r\n");  
  131.             writer.write("------------------------------\r\n");  
  132.             writer.write("  谢 谢 惠 顾\r\n");  
  133.             // 下面指令为打印完成后自动走纸  
  134.             writer.write(27);  
  135.             writer.write(100);  
  136.             writer.write(4);  
  137.             writer.write(10);  
  138.             writer.close();  
  139.             socketOut.close();  
  140.         } catch (IOException e) {  
  141.             e.printStackTrace();  
  142.         } catch (Exception e) {  
  143.             e.printStackTrace();  
  144.         }  
  145.         }  
  146.     }  
打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。

然后直接调用该方法就可以进行打印了,记住,android4.0之后不能在主线程中执行了,需要新建一个线程来执行该方法,如

  1. new Thread() {  
  2. <span style="white-space:pre">    </span>public void run() {  
  3. <span style="white-space:pre">        </span>try {  
  4. <span style="white-space:pre">            </span>new PrintLine().print(lists, mapgs, sn);  
  5. <span style="white-space:pre">        </span>} catch (IOException e) {  
  6. <span style="white-space:pre">            </span>e.printStackTrace();  
  7. <span style="white-space:pre">        </span>}  
  8. <span style="white-space:pre">    </span>};  
  9. }.start();  
其实android调用po
2015-04-17 13:43:23 sdvch 阅读数 4486

因为公司业务的需要,要用android客户端控制pos机打印票据,不单只是中文的,而且还要包括二维码的打印的!经过两天的努力!终于搞定了!!!!我真是!

首先,先奉上ESC/POS指令集。

EPSON打印控制指令集

打印命令                                 功能

格式:  ASCII: 以标准ASCII字符序列表示

    十进制: 以十进制数字序列表示

   十六进制: 以十六进制数字序列表示

说明:该命令功能和使用说明。

HT                                    水平制表

格式:  ASCII: HT

    十进制: 09

   十六进制: 09

说明:

打印位置进行到下一水平制表位置。

如果当前打印位置超过了最后一个水平制表位置,则HT命令不被执行。

水平制表位置由 ESC D命令设置。

LF                                     打印并换行

格式:  ASCII: LF

    十进制: 10

   十六进制: 0A

说明:

打印存放在行编辑缓存中的一行数据并按当前设定的行距向前走纸一行。ESC2ESC3指令可设定行距的长短。

如果行编辑缓存空,则只按当前设定的行距向前走纸一行。

CR                                     打印回车

格式:  ASCII: CR

    十进制: 13

   十六进制: 0D

说明:

  当打印在行编辑缓存中的一行数据之后,不进行走纸操作。

DLE EOT n                               实时状态传送

格式:  ASCII: DLE EOT n

    十进制: 16 04 n

   十六进制: 10 04

说明:

1 ≤ n ≤ 4

  传送以实时的方式,n代表被选择的打印机状态,基于下列参数:

n = 1: 打印机状态

n = 2: 脱机状态

n = 3: 错误状态

n = 4: 纸检测器状态

返回的字节每位设置如下:

n = 1: 打印机状态

n = 2: 脱机状态

n = 3: 错误状态

n = 4: 纸检测器状态

DLE ENQ n                             对打印机的实时请求

格式:  ASCII: DLE ENQ n

    十进制: 16 05 n

   十六进制: 10 5

说明:

n = 0, n = 2

打印机对主机请求作出反应,n值定义如下:

n = 0: 恢复到联机状态

n = 2: 清除接收和打印缓冲区,并恢复错误.

ESC SP n                             设置字符右间距

格式:  ASCII: ESC  SP n

    十进制: 27  32 n

   十六进制: 1B  20 n

说明:

以半点为设定单位(1/144英寸),设置字符右边间距为n个半点距。

默认值n0

ESC ! n                             设置字符打印方式

格式:  ASCII: ESC ! n

    十进制: 27  33 n

   十六进制: 1B  21 n

说明:

  0≤n≤255

ESC ! n是综合性的字符打印方式设置命令,用于选择打印字符的大小和下划线。

打印参数n的每位定义为:

   功能    

       0    1

0    字模选择    7×9    5×7

1    无定义        

2    无定义        

3    着重模式    取消    设定

4    倍 高    取消    设定

5    倍 宽    取消    设定

6    无定义        

7    下划线    取消    设定

默认值n0

ESC % n                         允许/禁止用户自定义字符

格式:  ASCII: ESC %  n

    十进制: 27  37 n

   十六进制: 1B  25 n

说明:

参数n为一个字节,只有最低位有效。

n=<*******1B时,选择用户自定义字符集;

n=<*******0B时,选择内部字符集。

0≤n≤255,默认值n0

ESC &                            设置用户自定义字符

格式: ASCII: ESC  &  y  n  m  x  d1  d2……db

  十进制: 27  38  y  n  m  x  d1  d2……db

  十六进制: 1B  26  y  n  m  x  d1  d2……db

说明:

该命令用于自定义字符。各参数为:

y:字符的纵向字节数。这里取 y12

n:自定义字符集的起始ASCII码,n≥32

m:自定义字符集的终止ASCII码,m≤127。自定义字符个数为m-n+1,最多可定义96个字符。

当只有一个自定义字符时,取m=n

a:自定义字符的水平方向的点数。

d1 d2……db:自定义字符的数据。每个字符 y×x个字节,m-n+1个自定义字符共有:

y×x×m-n+1)个字节。

每个自定义字符数据的格式:

d1    d3    …    dy×x×m-n+1-1

d2    d4    …    dy×x×m-n+1

样例如下:

发送的命令如下:

ESC & y c1 c2 X p1 p2 p3 d4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14

Code 1B 26 02 20 20 07 1F 80 20 00 44 00 80 00 44 00 20 00 1F 80

ESC *                                  设置图形点阵

格式:  ASCII: ESC  *  m  n1  n2    D1D2 … Dk

    十进制: 27   42   m  n1  n2    D1D2 … Dk

   十六进制: 1B   2A   m  n1  n2    D1D2 … Dk

说明:

该命令用来设置点阵图形模式(m)和横向图形点阵。

m = 01表示打印密度。

0≤n1≤2550≤n2≤10≤Dk≤255k= n1+ n2×256

n1n2为两位十六进制数,n1这低字节,n2这高字节,k= n1+ n2×256,表示该命令下载的要打印图形的横向点数,该值应小于打印机的最大行宽打印点数。如果下送的点图数据超出一行的最大行宽打印点数时,超出的部分被忽略。

m    垂直方向点数    点密度    最大点数    图形打印模式

0    8    单密度    210    相邻点打印

1    8    双密度    420    相邻点不打印

Dk 定义为:

ESC - n                            设置/取消下划线模式

格式:  ASCII: ESC  -  n 

    十进制: 27   45   n 

   十六进制: 1B   2D   n 

说明:

n = 0, 1, 48, 49

n = 0 or 48,取消下划线模式。

n = 1 or 49, 设置下划线模式。

ESC 2                               设定1/6英寸换行量

格式:  ASCII: ESC  2

    十进制: 27  50

   十六进制: 1B  32

说明:

此指令将打印机的换行量设定为1/6英寸。

ESC 3  n                            设定 n/144英寸换行量

格式:  ASCII: ESC  3  n

    十进制: 27  51  n

   十六进制: 1B  33  n

说明:

此指令将打印机的换行量设定为 n/144英寸。

n1 - 255

ESC 〈                                打印头归位

格式:  ASCII: ESC 〈

    十进制: 27  60

   十六进制: 1B  3C

说明:

执行该指令后,打针头会回到原位(home的位置)。

ESC = n                              设备设置/取消

格式:  ASCII: ESC  =  n 

    十进制: 27   61   n 

   十六进制: 1B   3D   n 

说明:

1 ≤ n ≤ 3

默认 n = 1

   功能    

       0    1

0    打印机选择    取消    设定

1    顾显选择    取消    设定

2    无定义        

3    无定义        

4    无定义        

5    无定义        

6    无定义        

7    无定义        

ESC n                          取消用户自定义字符

格式:  ASCII: ESC ?  n 

    十进制: 27   63   n 

   十六进制: 1B   3F   n 

说明:

32 ≤ n ≤ 126

ESC @                               初始化打印机

格式:  ASCII: ESC 

    十进制: 27  64

   十六进制: 1B  40

说明:

该命令初始化打印机:使打印机恢复到最初的联机状态,清除以前留下的程序。

ESC D NULL                         消除所有的水平制表位置

格式:  ASCII: ESC  D  NULL

    十进制: 27   68   0

   十六进制: 1B  44   0

说明:

ESC D NUL命令消除所有的水平制表位置,之后再执行的HT命令将无效。

ESC E n                               设置/取消着重模式

格式:  ASCII: ESC  E  NUL

    十进制: 27   69   0

   十六进制: 1B  45   0

说明:

0 ≤ n ≤ 255

nLSB位是0,取消着重模式。

nLSB位是1,设置着重模式。

ESC G n                               设置/取消重叠模式

格式:  ASCII: ESC  G  NUL

    十进制: 27   71   0

   十六进制: 1B  47   0

说明:

0 ≤ n ≤ 255

nLSB位是0,取消重叠模式。

nLSB位是1,设置重叠模式。

ESC J n                              执行n/144英寸走纸

格式:  ASCII: ESC   J  n

    十进制: 27   74   n

   十六进制: 1B  4A   n

说明:

进纸n/144英寸,n值应为0255之间的任意值。

若当时有打印内容则在打印完成后执行走纸。

ESC K n                              打印并反向走纸

格式:  ASCII: ESC   K  n

    十进制: 27   75   n

   十六进制: 1B  4B   n

说明:

0 ≤ n ≤ 48

打印缓冲区里的内容,并反方向走纸n/144英寸(n X 0.176 mm)。

ESC R n                              选择国际字符集

格式:  ASCII: ESC  R  n

    十进制: 27   82 n

   十六进制: 1B  52 n

说明:

ESC R用于选择11个不同国家的不同ASCII字符集。

n=0~10。默认值为0,选择U.S.A方式。

ESC U n                                 设置/取消单向打印

格式:  ASCII: ESC  U  n

    十进制: 27   85 n

   十六进制: 1B  55 n

说明:

设置/取消单向打印。n0~255,仅最低位有效。

n=<×××××××1B时,在字符方式下设置为准双向打印,在图形方式下设置为单向打印。

n=<×××××××0B时,设置双向打印。

默认值n=0

ESC a n                                    选择对齐模式

格式:  ASCII: ESC  a  n

    十进制: 27   97 n

   十六进制: 1B  61 n

说明:

0 ≤n ≤2, 48 ≤n ≤50

n选择对齐模式,默认值是0

n    对齐模式

048    左对齐

149    中对齐

250    右对齐

ESC c 3 n                              输出纸尽传感器

格式:  ASCII: ESC  c  3  n

    十进制: 27   99   51   n

   十六进制: 1B   63   33   n

说明:

   0 ≤ n ≤ 255

   n的定义见下表:

   功能    

       0    1

0    末端传感器    取消    设定

1    末端传感器    取消    设定

2    纸尽检测器    取消    设定

3    纸尽检测器    取消    设定

4    无定义        

5    无定义        

6    无定义        

7    无定义        

ESC c 4  n                           设定缺纸时停止打印

格式:  ASCII: ESC  c  4  n

    十进制: 27   99   52   n

   十六进制: 1B   63   34   n

说明:

设置/取消纸检测器检测到缺纸时停止打印。

N=0~255,仅最低位有效。

n=<*******1B时,纸检测器检测到缺纸时停止打印。

n=<*******0B时,纸检测器检测到缺纸时不停止打印,以便用户可以将最后一张单据打印至页底。

默认值n=1

ESC c 5 n                            允许/禁止走纸按键

格式:  ASCII: ESC   c   3   n

    十进制:  27   99 33   n

   十六进制:  1B   63 35   n

说明:

n=<*******1B时,禁止纸按键。

n=<*******0B时,允许纸按键(默认值)

ESC d n                             打印并进纸n字符行

格式:  ASCII: ESC  d    n

    十进制: 27   100   n

   十六进制: 1B   64   n

说明:

打印行缓存里的数据并向前走纸n行。

n=0~255

ESC e n                           打印并反向进纸n字符行

格式:  ASCII: ESC  e    n

    十进制: 27   101   n

   十六进制: 1B   65   n

说明:

打印行缓存里的数据并向前走纸n行。

0 ≤ n ≤ 2

ESC p                                产生钱箱驱动脉冲

格式:  ASCII: ESC  p    m   n1   n2

    十进制: 27   112   m   n1   n2

   十六进制: 1B   70   m   n1   n2

说明:

产生钱箱驱动脉冲。

m0,1,48,49 0≤n1≤n2≤255

驱动脉冲形式为:

解释:

打开钱箱脉冲时间为n1×2毫秒。

关闭钱箱脉冲时间为n2×2毫秒。

ESC r n                               选择打印颜色

格式:  ASCII: ESC  r    n

    十进制: 27   114   n

   十六进制: 1B   72   n

说明:

   n = 048,黑色打印

n = 149,红色打印

默认n = 0

ESC t n                                 选择字符集

格式:  ASCII: ESC  t    n

    十进制: 27   116   n

   十六进制: 1B   74   n

说明:

选择中文方式下的ASCII字符集。

0选择7×9字符集(默认值)。

1选择7×7字符集。

ESC { n                            设置/取消倒向打印模式

格式:  ASCII: ESC  {    n

    十进制: 27   123   n

   十六进制: 1B   7B   n

说明:

0 ≤ n ≤ 255

nLSB位是0,取消倒向打印模式。

nLSB位是1,设置倒向打印模式。

默认n = 0

FS !                                 汉字综合选择

格式:  ASCII: FS        n

    十进制: 28   33     n

   十六进制: 1C   21     n

说明:

n的各位的定义如下:

   0    1

0    无定义

1    无定义

2    宽正常    汉字倍高

3    高度正常    汉字倍高

4    无定义

5    无定义

6    无定义

7    无下划线    汉字下划线

FS &                              进入汉字打印方式

格式:  ASCII: FS   

    十进制: 28   38

   十六进制: 1C   26

说明:

打印机接收到该命令后,结束本行打印,从下一行开始转为汉字打印方式。

在汉字打印方式时,打印机接收的代码为2字节的标准机内码(均为大于9FH的码),根据该代码寻找打印机的硬汉字字模,打印国标15×16点阵的汉字。

打印机接收到单字节的ASCII码(20H9FH)时,将打印出相应的5 ×77×7点阵字符。

FS ~   S                               选择汉字打印速度

格式:  ASCII: FS    ~   S   n

    十进制: 28   126 83   n

   十六进制: 1C   7E 53   n

说明:

此功能设置汉字打印模式时的打印速度,当n=1时为汉字高速打印,横向分辨率为144 DPI,纵向分辨率为72 DPI

n=0时为正常打印模式,横向分辨率为144 DPI,纵向分辨率为144 DPI此模式为默认模式。

FS ·                               退出汉字打印方式

格式:  ASCII: FS    ·

    十进制: 28   46

   十六进制: 1C   2E

说明:

  打印机接收到该命令后,退出汉字打印方式,转为正常的西文打印方式。

FS 2                                 用户自定义汉字

格式:  ASCII: FS    2   a1   a2 d1 d2 d3 …d32

    十进制: 28   50   248 a2 d1 d2 d3 …d32

   十六进制: 1C   32   F8   a2 d1 d2 d3   d32

说明:

  此功能为用户自定义汉字。

a1=F8(十六进制)

a2A1FE(十六进制)之间任意值。

因汉字代码为二字节,a1为第一字节,a2为第二字节,可定义94个汉字。

十六进制代码如下:

IC 32 77 21 00 00 38 20 20 20 20 20 24 20 24 20 24 21 24 21 E4 FF 24 20 25 20 26 20 24 20 20 20 20 20 38 20

FS ? c1   c2                        取消用户自定义汉字

格式:  ASCII: FS  ?    c1   c2

    十进制: 28   63   c1   c2

   十六进制: 1C   3F   c1   c2

说明:

c1c2指待定义字符的字符编码。c1c2的取值范围视采用的字符编码系统而定,如下表:

模式选择    C1    C2

日文汉字模式(JIS编码系统)    C1=77H    21H≤C2≤7EH

日文汉字模式(转换JIS编码系统)    C1=ECH    40H≤C2≤7EH80H≤C2≤9EH

简体汉字模式    C1=FEH    A1H≤C2≤FEH

繁体汉字模式    C1=FEH    A1H≤C2≤FEH

FS C n                          设定日文汉字编码系统

格式:  ASCII: FS  C    n

    十进制: 28   67   n

   十六进制: 1C   43   n

说明:

  n = 0, 1

n有如下定义:

n    日文汉字系统

0    JIS编码

1    转换JIS编码

默认n=0

FS  S n1   n2                            设定全角汉字字间距

格式:  ASCII: FS S   n1   n2

    十进制: 28   83   n1   n2

   十六进制: 1C  53   n1   n2

说明:

0≤n1,n2≤127,n1决定字符左边间距,n2决定字符右边间距。

单位是1/160英寸,电源打开时的初始设定为n1=0,n2=2

FS  W  n                          设定/取消四倍角汉字模式

格式:  ASCII: FS W   n

    十进制: 28   87   n

   十六进制: 1C  57   n

说明:

0≤n≤255

   nLSB位是0,取消四倍角汉字模式。

nLSB位是1,设置四倍角汉字模式。

默认n=0

GS ( F pL pH a m nL nH                  设置黑标定位偏移量

格式:  ASCII: GS ( F   pL pH a m nL nH    

十进制: 29 40 70 pL pH a m nL nH

  十六进制: 1D 28 46 pL pH a m nL nH  

说明:

该命令用于选择黑标定位控制允许,且设置切/撕纸位置或起始打

印位置相对于黑标检测的偏移量。该值以点数计算。

命令相关参数为:

pL+(pHx256)=4 pL=4,pH=0

1≤a≤2

m=0,48

0≤(nL+nHx256)<1700

l    a 用来选择设置切/撕纸位置或起始打印位置的偏移量。

a    功能

1    设置起始打印位置相对于黑标检测位置的偏移量

2    设置切/撕纸位置相对于黑标检测位置的偏移量

l    m=048,选择偏移量为前进纸方向计算;

l    nL,nH设置的偏移量对应实际距离为(nL+nHx256)×0.176mm

l    只有执行此命令后GS FF GS V命令有关黑标定位操作方有效;

l    设置起始打印位置偏移量(a=1)在执行GS FF命令时有效;

l    设置切/撕纸位置偏移量(a=2)在执行GS V m命令时有效;

l    默认值为nL=nH=0,即黑标检测开关检测到黑标时,当前票面上对应打印头的位置为设定的起始打印位置,当前票面上对应切/撕纸口的位置为设定的切/撕纸位置。

l    关于切/撕纸位置偏移量和起始打印位置偏移量的计算说明

1    /撕纸位置到黑标印刷位置的距离L与打印机的固有机械值L0相同,而且切/撕纸位置到起始打印位置的距离Q与打印机构固定的机械值Q0相同时,即用GS F命令所设置的偏移量均为0

2    当黑标印刷位置到切/纸位置的距离L小于打印的机械值L0时,GS F命令的切/撕纸位置偏移量计算为:

        /撕纸位置偏移量=L0—L/0.176(点数)

3    当黑标印刷位置到切/撕纸位置的距离L大于打印机的机械值L0时,GS F命令的切 /撕纸位置偏移量计算为:

        /撕纸位置偏移量=L0+相邻两黑标间的距离—L/0.176(点数)。

注意:在设置切/撕纸位置偏移量时,GS F命令的参数a应为2

4    当切/撕纸位置偏移量不为零或每单的起始打印位置到切/撕纸位置的距离Q大于打印机的机械值Q0)时,GS F命令的切/撕纸位置偏移量计算为:

        起始打印位置偏移量=Q—Q0/0.176 +/撕纸位置偏移量。

注意:在设置切/撕纸位置偏移量时,GS F命令的参数a应为1

5    打印结构M—U110051)的固有机械值

      L0=39mm,     Q0=11mm,

当打印机构安装在机壳内,使得撕纸位置和打印起始位置的固有机械值发生改变时

L0=39+L     Q0=11+L

6    L的测量方法如下:

1    先将空白打印纸装入打印机械,撕去出纸口上多余的打印纸

2    给打印机发20个字符“E”,打印在打印纸上

3    让打印机发走出足够长度,测量纸端到打印字符“EEEEEEEEEEEEEEEEEEEE”的上沿距离,该值减去11mm,即为△L。切/撕纸位置起始打印位置

GS  I  n                                 传送打印机ID

格式:  ASCII: GS  I   n

    十进制: 29   73   n

   十六进制: 1D  49   n

说明:

1 ≤n ≤3, 49 ≤n ≤51, 65 ≤n ≤69

n值定义如下:

n    打印机ID    规格    ID(十六进制)

149    打印机模式ID    TM200系列    0D

250    ID型号    见下表

351    ROM版本ID    ROM版本

65    硬件版本    取决于硬件版本

66    制造商    EPSON

67    打印机名称    TM200

68    打印机串号    取决于打印机串号

69    支持多国语言字符    日本模式:日本汉字中国模式:GB2312台湾模式:BIG-5泰国模式:THAI 3 PASS

GS V                                走纸到切纸位置

格式:① ASCII: GS    V   m

    十进制: 29   86   m

十六进制: 1D   56   m

ASCII: GS    V   m   n

    十进制: 29   86   m   n

十六进制: 1D   56   m   n

说明:

m1,49。②m660≤n≤255

M          

149    部分切纸(无切刀则无切纸动作)

66    走纸到(切纸位置+n×1/144英寸)位置并部分切纸(无切纸刀则无切纸动作)

GS  a  n                            设定/取消自动返回状态

格式:  ASCII: GS  a    n

    十进制: 29   97   n

   十六进制: 1D  61   n

说明:

0≤n≤255n值定义如下表:

   功能    

       0    1

0    钱箱检测信号    取消    设定

1    联机    取消    设定

2    错误状态    取消    设定

3    进纸传感器状态    取消    设定

4    无定义        

5    无定义        

6    无定义        

7    无定义        

GS  r  n                                    状态传送

格式:  ASCII: GS  a    n

    十进制: 29   114   n

   十六进制: 1D  72   n

说明:

1 ≤n ≤2, 49 ≤n ≤50n值定义如下表:

n    功能

149    纸检测器状态

250    钱箱检测器状态

n=149时,传送字节定义如下:

   功能    

       0    1

0,1    纸检测信号    有纸    无纸

2,3    纸检测信号    有纸    无纸

4    无定义        

5    无定义        

6    无定义        

7    无定义        

n=250时,传送字节定义如下:

   功能    

       0    1

0    钱箱检测信号    低电平    低电平

1    联机        

2    无定义        

3    无定义        

4    无定义        

5    无定义        

6    无定义        

7    无定义        

GS  z  0   t1  t2                      设置联机恢复等待时间

格式:  ASCII: GS  z  0   t1  t2

    十进制: 29 122 48   t1  t2

   十六进制: 1D  7A 30 t1  t2

说明:

0 ≤t1 ≤2550 ≤t2 ≤255

设置进纸等待时间到大约t1 X 500ms,恢复确定时间到大约t2 X 500ms

t1=0时,一旦有纸插入,打印机即进入恢复确定状态。t2=0时,恢复确定时间取消。

命令(ASCII)    十六进制    功能说明

HT    9    打印位置进行到下一水平制表位置

LF    0a    打印行缓冲器里的内容,并向前走纸一行

CR    0D    打印回车

ESC SP    1B 20 n    设置字符右边的字间距为n个半点距(1/140英寸)

DLE EOT n    10 04    实时状态传送

DLE ENQ n    10 5    对打印机的实时请求

ESC SP n    1B 20 n    设置字符右间距

ESC ! n    1B 21 n    设置字符打印方式

ESC % n    1B 25 n    允许/禁止用户自定义字符

ESC &    1B 26    设置用户自定义字符

ESC *    1B 2A    设置图形点阵

ESC - n    1B 2D n    设置/取消下划线模式

ESC 2    1B 32    设定1/6英寸换行量

ESC 3  n    1B 33 n    设定 n/144英寸换行量

ESC 〈    1B 3C    打印头归位

ESC = n    1B 3D n    设备设置/取消

ESC n    1B 3F n    取消用户自定义字符

ESC @    1B 40    初始化打印机

ESC D NULL    1B 44 0    消除所有的水平制表位置

ESC E n    1B 45 0    设置/取消着重模式

ESC G n    1B 47 0    设置/取消重叠模式

ESC J n    1B 4A n    执行n/144英寸走纸

ESC K n    1B 4B n    打印并反向走纸

ESC R n    1B 52 n    选择国际字符集

ESC U n    1B 55 n    设置/取消单向打印

ESC a n    1B 61 n    选择对齐模式

ESC c 3 n    1B 63 33 n    输出纸尽传感器

ESC c 4  n    1B 63 34 n    设定缺纸时停止打印

ESC c 5  n    1B 63 35 n    允许/禁止走纸按键

ESC d n    1B 64 n    打印并进纸n字符行

ESC e n    1B 65 n    打印并反向进纸n字符行

ESC p    1B 70    产生钱箱驱动脉冲

ESC r n    1B 72 n    选择打印颜色

ESC t n    1B 73 n    选择字符集

ESC { n    1B 7B n    设置/取消倒向打印模式

FS     1B 75 n    汉字综合选择

FS     1C 26    进入汉字打印方式

FS ~   S    1C 7E 53 n    选择汉字打印速度

FS ·    1C 2E    退出汉字打印方式

FS 2    1C 32    用户自定义汉字

FS ? c1   c2    1C 3F c1 c2    取消用户自定义汉字

FS C n    1C 43 n    设定日文汉字编码系统

FS S n1 n2    1C 53 n1 n2    设定全角汉字字间距

FS W n    1C 57 n    设定/取消四倍角汉字模式

GS ( F pL pH a m nL nH    1D 28    设置黑标定位偏移量

GS  I  n    1D  49   n    传送打印机ID

GS V    1D   56   m    走纸到切纸位置

   1D   56 m n    

GS  a  n    1D  61   n    设定/取消自动返回状态

GS  r  n    1D  72   n    状态传送

GS  z    1D  7A    设置联机恢复等待时间


文档的内容比较多,我觉得可以需要打印什么格式什么内容的时候再进行参考。
2014-11-29 11:34:11 qianqianyihao 阅读数 4750

上一篇文章结束了ESC/POS的指令集,没看过的可以去看一下,可以当作工具文档来使用的

android 控制POS机图文打印(一)

这一篇正式介绍如何使用POS机来打印图文信息。

首先介绍一下,ESC/POS指令是如何使用的,

字体加粗指令:

byte[] FONT_B = new byte[3];

FONT_B[0] = 27;

FONT_B[1] = 33;

FONT_B[2] = 8;

字体纵向放大一倍:

byte[] CLEAR_FONT = new byte[3];

CLEAR_FONT[0] = 0x1c;

CLEAR_FONT[1] = 0x21;

CLEAR_FONT[2] = 0;

清除字体放大指令:

byte[] FD_FONT = new byte[3];

FD_FONT[0] = 0x1c;

FD_FONT[1] = 0x21;

FD_FONT[2] = 4;

打印条形码指令:

byte[] PRINT_CODE = new byte[9];

PRINT_CODE[0] = 0x1d;

PRINT_CODE[1] = 0x68;

PRINT_CODE[2] = 120;

PRINT_CODE[3] = 0x1d;

PRINT_CODE[4] = 0x48;

PRINT_CODE[5] = 0x10;

PRINT_CODE[6] = 0x1d;

PRINT_CODE[7] = 0x6B;

PRINT_CODE[8] = 0x02;

等等的指令使用。。。

可以参考下上一篇文章的指令集来进行设置。其中,ESC/POS指令是可以进行十进制和十六进制的设定的,这个大家要注意了。

接下来是介绍如何连接到打印机。

private static String PRINT_IP = "192.168.1.111";// 打印机IP地址

private static int PRINT_PORT = 9100;// 打印机端口 默认为9100 建议不要修改打印机端口,修改了可能会连接不上的

这里设定了打印机的IP地址和端口,其中,端口号为9100是打印机默认的设置,最好就不要去修改,如果修改了,可能导致连接不上的,我一开始的时候设置了9000,就连接不上了。。。

然后就通过socket进行连接打印机

// 建立打印机连接

socket = new Socket();

InetSocketAddress iSocketAddress = new InetSocketAddress(PRINT_IP, PRINT_PORT);// 绑定打印机

socket.connect(iSocketAddress);// 建立连接

接下来就是写一个打印的方法,调用打印机传输指令和数据到打印机进行打印。

直接上代码了,代码里面的注释得非常清楚

/**
	 * @param PRINT_DATA
	 *            小票主要数据
	 * @param GS_INFO
	 *            小票附带信息
	 * @param CAIDAN_SN
	 *            小票号码
	 */
	public void print(List<Map<String, Object>> PRINT_DATA,Map<String, String> GS_INFO, String CAIDAN_SN) {
		if (PRINT_DATA != null && PRINT_DATA.size() > 0) {
		try {
			// 条码打印指令
			byte[] PRINT_CODE = new byte[9];
			PRINT_CODE[0] = 0x1d;
			PRINT_CODE[1] = 0x68;
			PRINT_CODE[2] = 120;
			PRINT_CODE[3] = 0x1d;
			PRINT_CODE[4] = 0x48;
			PRINT_CODE[5] = 0x10;
			PRINT_CODE[6] = 0x1d;
			PRINT_CODE[7] = 0x6B;
			PRINT_CODE[8] = 0x02;

			// 清除字体放大指令
			byte[] FD_FONT = new byte[3];
			FD_FONT[0] = 0x1c;
			FD_FONT[1] = 0x21;
			FD_FONT[2] = 4;
			
			// 字体加粗指令
			byte[] FONT_B = new byte[3];
			FONT_B[0] = 27;
			FONT_B[1] = 33;
			FONT_B[2] = 8;
			
			// 字体纵向放大一倍
			byte[] CLEAR_FONT = new byte[3];
			CLEAR_FONT[0] = 0x1c;
			CLEAR_FONT[1] = 0x21;
			CLEAR_FONT[2] = 0;
			
			// 计算合计金额
			int price = 0;
			
			// 初始化打印机
			socketOut.write(27);
			socketOut.write(64);
			socketOut.write(FD_FONT);// 字体放大
			socketOut.write(FONT_B);// 字体加粗
			socketOut.write(10);
			writer.write("  " + GS_INFO.get("GS_Name") + " \r\n");
			writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效

			socketOut.write(CLEAR_FONT);
			socketOut.write(10);
			writer.write("NO: " + CAIDAN_SN + " \r\n");
			writer.write("------------------------------\r\n");
			writer.write("买家姓名: " + GS_INFO.get("GS_user_name") + "\r\n");
			writer.write("地址: " + GS_INFO.get("GS_address") + "\r\n");
			writer.write("联系电话: " + GS_INFO.get("GS_tel") + " \r\n");
			writer.write("付款方式: " + GS_INFO.get("GS_pay_type") + "\r\n");
			writer.write("------------------------------\r\n");
			writer.write(Fix_String_Lenth(1,Colum_Name[0], 4)
					+ Fix_String_Lenth(0,Colum_Name[1], 14)
					+ Fix_String_Lenth(1,Colum_Name[2], 4)
					+ Fix_String_Lenth(1,Colum_Name[3], 6) + "\r\n");
			for (int i = 0; i < PRINT_DATA.size() - 1; i++) {
				writer.write(Fix_String_Lenth(1,i + 1 + "", 2)
						+ Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name").toString(), 14)
						+ Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_num").toString(), 4)
						+ Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price").toString(), 6) + "\r\n");
				price += Double.parseDouble(PRINT_DATA.get(i).get("cai_price").toString());
			}
			
			// 打印二维码
			Bitmap bmp = (Bitmap)PRINT_DATA.get(PRINT_DATA.size() - 1).get("erweima");
			
            byte[] data = new byte[] { 0x1B, 0x33, 0x00 };
            socketOut.write(data);
            data[0] = (byte)0x00;
            data[1] = (byte)0x00;
            data[2] = (byte)0x00;    //重置参数
            
            int pixelColor;
            
            // ESC * m nL nH 点阵图
            byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };
            
            escBmp[2] = (byte)0x21;
            
            //nL, nH  
            escBmp[3] = (byte)(bmp.getWidth() % 256);
            escBmp[4] = (byte)(bmp.getWidth() / 256);
            
            // 每行进行打印
            for (int i = 0; i < bmp.getHeight()  / 24 + 1; i++){
            	socketOut.write(escBmp);
            	
                for (int j = 0; j < bmp.getWidth(); j++){
                    for (int k = 0; k < 24; k++){
                        if (((i * 24) + k) < bmp.getHeight()){
                            pixelColor = bmp.getPixel(j, (i * 24) + k);
                            if (pixelColor != -1){
                            	data[k / 8] += (byte)(128 >> (k % 8));
                            }
                        }
                    }
                    
                    socketOut.write(data);
                    // 重置参数
                    data[0] = (byte)0x00;
                    data[1] = (byte)0x00;
                    data[2] = (byte)0x00;
                }
                //换行
                byte[] byte_send1 = new byte[2];
                byte_send1[0] = 0x0d;
                byte_send1[1] = 0x0a;
                socketOut.write(byte_send1);
            }
            
            //换行
            byte[] byte_send2 = new byte[2];
            byte_send2[0] = 0x0d;
            byte_send2[1] = 0x0a;
            //发送测试信息 
            socketOut.write(byte_send2);
            
			writer.write("------------------------------\r\n");
			writer.write("本单共" + (PRINT_DATA.size() - 1) + "件商品,合计费用:" + price + "元\r\n");
			writer.write("------------------------------\r\n");
			writer.write("  谢 谢 惠 顾\r\n");
			// 下面指令为打印完成后自动走纸
			writer.write(27);
			writer.write(100);
			writer.write(4);
			writer.write(10);
			writer.close();
			socketOut.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		}
	}
打印文字是传输String过去进行打印的,而需要打印图片的话比较麻烦一下,需要把图片转换成点阵数据然后进行每行打印,可以参考print方法。

然后直接调用该方法就可以进行打印了,记住,android4.0之后不能在主线程中执行了,需要新建一个线程来执行该方法,如

new Thread() {
<span style="white-space:pre">	</span>public void run() {
<span style="white-space:pre">		</span>try {
<span style="white-space:pre">			</span>new PrintLine().print(lists, mapgs, sn);
<span style="white-space:pre">		</span>} catch (IOException e) {
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>};
}.start();
其实android调用pos机进行打印也不是想象中的那么难搞的,只要把ESC/POS指令掌握了,如何传输指令和数据过去搞定了,就不难了,如果还需要其他操作,比如打印特殊符号,字体的其他效果的打印等等,都可以参考print方法中传输指令的方式进行设定,pos机就能识别到指令接收到数据进行打印了,是不是挺简单的?有什么问题大家可以一起讨论的,本人也是初次接触pos机的。


2014-11-28 17:31:58 qianqianyihao 阅读数 3648

因为公司业务的需要,要用android客户端控制pos机打印票据,不单只是中文的,而且还要包括二维码的打印的!经过两天的努力!终于搞定了!!!!我真是!

首先,先奉上ESC/POS指令集。

EPSON打印控制指令集

打印命令                                  功能

格式:  ASCII: 以标准ASCII字符序列表示

    十进制: 以十进制数字序列表示

   十六进制: 以十六进制数字序列表示

说明:该命令功能和使用说明。

HT                                     水平制表

格式:  ASCII: HT

    十进制: 09

   十六进制: 09

说明:

打印位置进行到下一水平制表位置。

如果当前打印位置超过了最后一个水平制表位置,则HT命令不被执行。

水平制表位置由 ESC D命令设置。

LF                                      打印并换行

格式:  ASCII: LF

    十进制: 10

   十六进制: 0A

说明:

打印存放在行编辑缓存中的一行数据并按当前设定的行距向前走纸一行。ESC2ESC3指令可设定行距的长短。

如果行编辑缓存空,则只按当前设定的行距向前走纸一行。

CR                                      打印回车

格式:  ASCII: CR

    十进制: 13

   十六进制: 0D

说明:

  当打印在行编辑缓存中的一行数据之后,不进行走纸操作。

DLE EOT n                                实时状态传送

格式:  ASCII: DLE EOT n

    十进制: 16 04 n

   十六进制: 10 04

说明:

1 ≤ n ≤ 4

  传送以实时的方式,n代表被选择的打印机状态,基于下列参数:

n = 1: 打印机状态

n = 2: 脱机状态

n = 3: 错误状态

n = 4: 纸检测器状态

返回的字节每位设置如下:

n = 1: 打印机状态

n = 2: 脱机状态

n = 3: 错误状态

n = 4: 纸检测器状态

DLE ENQ n                              对打印机的实时请求

格式:  ASCII: DLE ENQ n

    十进制: 16 05 n

   十六进制: 10 5

说明:

n = 0, n = 2

打印机对主机请求作出反应,n值定义如下:

n = 0: 恢复到联机状态

n = 2: 清除接收和打印缓冲区,并恢复错误.

ESC SP n                              设置字符右间距

格式:  ASCII: ESC  SP n

    十进制: 27  32 n

   十六进制: 1B  20 n

说明:

以半点为设定单位(1/144英寸),设置字符右边间距为n个半点距。

默认值n0

ESC ! n                              设置字符打印方式

格式:  ASCII: ESC  ! n

    十进制: 27  33 n

   十六进制: 1B  21 n

说明:

  0≤n≤255

ESC ! n是综合性的字符打印方式设置命令,用于选择打印字符的大小和下划线。

打印参数n的每位定义为:

   功能    

       0    1

0    字模选择    7×9    5×7

1    无定义        

2    无定义        

3    着重模式    取消    设定

4    倍 高    取消    设定

5    倍 宽    取消    设定

6    无定义        

7    下划线    取消    设定

默认值n0

ESC % n                          允许/禁止用户自定义字符

格式:  ASCII: ESC  %  n

    十进制: 27  37 n

   十六进制: 1B  25 n

说明:

参数n为一个字节,只有最低位有效。

n=<*******1B时,选择用户自定义字符集;

n=<*******0B时,选择内部字符集。

0≤n≤255,默认值n0

ESC &                             设置用户自定义字符

格式: ASCII: ESC  &  y  n  m  x  d1  d2……db

   十进制: 27  38  y  n  m  x  d1  d2……db

  十六进制: 1B  26  y  n  m  x  d1  d2……db

说明:

该命令用于自定义字符。各参数为:

y:字符的纵向字节数。这里取 y12

n:自定义字符集的起始ASCII码,n≥32

m:自定义字符集的终止ASCII码,m≤127。自定义字符个数为m-n+1,最多可定义96个字符。

当只有一个自定义字符时,取m=n

a:自定义字符的水平方向的点数。

d1 d2……db:自定义字符的数据。每个字符 y×x个字节,m-n+1个自定义字符共有:

y×x×m-n+1)个字节。

每个自定义字符数据的格式:

d1    d3    …    dy×x×m-n+1-1

d2    d4    …    dy×x×m-n+1

样例如下:

发送的命令如下:

ESC & y c1 c2 X p1 p2 p3 d4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14

Code 1B 26 02 20 20 07 1F 80 20 00 44 00 80 00 44 00 20 00 1F 80

ESC *                                   设置图形点阵

格式:  ASCII: ESC  *  m  n1  n2    D1D2 … Dk

     十进制: 27   42   m  n1  n2    D1D2 … Dk

    十六进制: 1B   2A   m  n1  n2    D1D2 … Dk

说明:

该命令用来设置点阵图形模式(m)和横向图形点阵。

m = 01 表示打印密度。

0≤n1≤2550≤n2≤10≤Dk≤255k= n1+ n2×256

n1n2为两位十六进制数,n1这低字节,n2这高字节,k= n1+ n2×256,表示该命令下载的要打印图形的横向点数,该值应小于打印机的最大行宽打印点数。如果下送的点图数据超出一行的最大行宽打印点数时,超出的部分被忽略。

m    垂直方向点数    点密度    最大点数    图形打印模式

0    8    单密度    210    相邻点打印

1    8    双密度    420    相邻点不打印

Dk 定义为:

ESC - n                             设置/取消下划线模式

格式:  ASCII: ESC  -  n 

     十进制: 27   45   n 

    十六进制: 1B   2D   n 

说明:

n = 0, 1, 48, 49

n = 0 or 48,取消下划线模式。

n = 1 or 49, 设置下划线模式。

ESC 2                                设定1/6英寸换行量

格式:  ASCII: ESC  2

    十进制: 27  50

   十六进制: 1B  32

说明:

此指令将打印机的换行量设定为1/6英寸。

ESC 3  n                             设定 n/144英寸换行量

格式:  ASCII: ESC  3  n

    十进制: 27  51  n

   十六进制: 1B  33  n

说明:

此指令将打印机的换行量设定为 n/144英寸。

n1 - 255

ESC 〈                                 打印头归位

格式:  ASCII: ESC 〈

    十进制: 27  60

   十六进制: 1B  3C

说明:

执行该指令后,打针头会回到原位(home的位置)。

ESC = n                               设备设置/取消

格式:  ASCII: ESC  =  n 

     十进制: 27   61   n 

    十六进制: 1B   3D   n 

说明:

1 ≤ n ≤ 3

默认 n = 1

   功能    

       0    1

0    打印机选择    取消    设定

1    顾显选择    取消    设定

2    无定义        

3    无定义        

4    无定义        

5    无定义        

6    无定义        

7    无定义        

ESC n                           取消用户自定义字符

格式:  ASCII: ESC  ?  n 

     十进制: 27   63   n 

    十六进制: 1B   3F   n 

说明:

32 ≤ n ≤ 126

ESC @                                初始化打印机

格式:  ASCII: ESC 

    十进制: 27  64

   十六进制: 1B  40

说明:

该命令初始化打印机:使打印机恢复到最初的联机状态,清除以前留下的程序。

ESC D NULL                          消除所有的水平制表位置

格式:  ASCII: ESC  D  NULL

    十进制: 27   68   0

   十六进制: 1B  44   0

说明:

ESC D NUL命令消除所有的水平制表位置,之后再执行的HT命令将无效。

ESC E n                                设置/取消着重模式

格式:  ASCII: ESC  E  NUL

    十进制: 27   69   0

   十六进制: 1B  45   0

说明:

0 ≤ n ≤ 255

nLSB位是0,取消着重模式。

nLSB位是1,设置着重模式。

ESC G n                                设置/取消重叠模式

格式:  ASCII: ESC  G  NUL

    十进制: 27   71   0

   十六进制: 1B  47   0

说明:

0 ≤ n ≤ 255

nLSB位是0,取消重叠模式。

nLSB位是1,设置重叠模式。

ESC J n                               执行n/144英寸走纸

格式:  ASCII: ESC   J  n

    十进制: 27   74   n

   十六进制: 1B  4A   n

说明:

进纸n/144英寸,n值应为0255之间的任意值。

若当时有打印内容则在打印完成后执行走纸。

ESC K n                               打印并反向走纸

格式:  ASCII: ESC   K  n

    十进制: 27   75   n

   十六进制: 1B  4B   n

说明:

0 ≤ n ≤ 48

打印缓冲区里的内容,并反方向走纸n/144英寸(n X 0.176 mm)。

ESC R n                               选择国际字符集

格式:  ASCII: ESC  R  n

    十进制: 27   82 n

   十六进制: 1B  52 n

说明:

ESC R用于选择11个不同国家的不同ASCII字符集。

n=0~10。默认值为0,选择U.S.A方式。

ESC U n                                  设置/取消单向打印

格式:  ASCII: ESC  U  n

    十进制: 27   85 n

   十六进制: 1B  55 n

说明:

设置/取消单向打印。n0~255,仅最低位有效。

n=<×××××××1B时,在字符方式下设置为准双向打印,在图形方式下设置为单向打印。

n=<×××××××0B时,设置双向打印。

默认值n=0

ESC a n                                     选择对齐模式

格式:  ASCII: ESC  a  n

    十进制: 27   97 n

   十六进制: 1B  61 n

说明:

0 ≤n ≤2, 48 ≤n ≤50

n选择对齐模式,默认值是0

n    对齐模式

048    左对齐

149    中对齐

250    右对齐

ESC c 3 n                               输出纸尽传感器

格式:  ASCII: ESC  c  3  n

    十进制: 27   99   51   n

   十六进制: 1B   63   33   n

说明:

   0 ≤ n ≤ 255

   n的定义见下表:

   功能    

       0    1

0    末端传感器    取消    设定

1    末端传感器    取消    设定

2    纸尽检测器    取消    设定

3    纸尽检测器    取消    设定

4    无定义        

5    无定义        

6    无定义        

7    无定义        

ESC c 4  n                            设定缺纸时停止打印

格式:  ASCII: ESC  c  4  n

    十进制: 27   99   52   n

   十六进制: 1B   63   34   n

说明:

设置/取消纸检测器检测到缺纸时停止打印。

N=0~255,仅最低位有效。

n=<*******1B时,纸检测器检测到缺纸时停止打印。

n=<*******0B时,纸检测器检测到缺纸时不停止打印,以便用户可以将最后一张单据打印至页底。

默认值n=1

ESC c 5 n                             允许/禁止走纸按键

格式:  ASCII: ESC   c   3   n

    十进制:  27   99 33   n

   十六进制:  1B   63 35   n

说明:

n=<*******1B时,禁止纸按键。

n=<*******0B时,允许纸按键(默认值)

ESC d n                              打印并进纸n字符行

格式:  ASCII: ESC  d    n

    十进制: 27   100   n

   十六进制: 1B   64   n

说明:

打印行缓存里的数据并向前走纸n行。

n=0~255

ESC e n                            打印并反向进纸n字符行

格式:  ASCII: ESC  e    n

    十进制: 27   101   n

   十六进制: 1B   65   n

说明:

打印行缓存里的数据并向前走纸n行。

0 ≤ n ≤ 2

ESC p                                 产生钱箱驱动脉冲

格式:  ASCII: ESC  p    m   n1   n2

    十进制: 27   112   m   n1   n2

   十六进制: 1B   70   m   n1   n2

说明:

产生钱箱驱动脉冲。

m0,1,48,49 0≤n1≤n2≤255

驱动脉冲形式为:

解释:

打开钱箱脉冲时间为n1×2毫秒。

关闭钱箱脉冲时间为n2×2毫秒。

ESC r n                                选择打印颜色

格式:  ASCII: ESC  r    n

    十进制: 27   114   n

   十六进制: 1B   72   n

说明:

   n = 048,黑色打印

n = 149,红色打印

默认n = 0

ESC t n                                  选择字符集

格式:  ASCII: ESC  t    n

    十进制: 27   116   n

   十六进制: 1B   74   n

说明:

选择中文方式下的ASCII字符集。

0 选择7×9字符集(默认值)。

1 选择7×7字符集。

ESC { n                             设置/取消倒向打印模式

格式:  ASCII: ESC  {    n

    十进制: 27   123   n

   十六进制: 1B   7B   n

说明:

0 ≤ n ≤ 255

nLSB位是0,取消倒向打印模式。

nLSB位是1,设置倒向打印模式。

默认n = 0

FS  !                                 汉字综合选择

格式:  ASCII: FS        n

    十进制: 28   33     n

   十六进制: 1C   21     n

说明:

n的各位的定义如下:

   0    1

0    无定义

1    无定义

2    宽正常    汉字倍高

3    高度正常    汉字倍高

4    无定义

5    无定义

6    无定义

7    无下划线    汉字下划线

FS &                               进入汉字打印方式

格式:  ASCII: FS   

    十进制: 28   38

   十六进制: 1C   26

说明:

打印机接收到该命令后,结束本行打印,从下一行开始转为汉字打印方式。

在汉字打印方式时,打印机接收的代码为2字节的标准机内码(均为大于9FH的码),根据该代码寻找打印机的硬汉字字模,打印国标15×16点阵的汉字。

打印机接收到单字节的ASCII码(20H9FH)时,将打印出相应的5 ×77×7点阵字符。

FS ~   S                                选择汉字打印速度

格式:  ASCII: FS    ~   S   n

    十进制: 28   126 83   n

   十六进制: 1C   7E 53   n

说明:

此功能设置汉字打印模式时的打印速度,当n=1时为汉字高速打印,横向分辨率为144 DPI,纵向分辨率为72 DPI

n=0时为正常打印模式,横向分辨率为144 DPI,纵向分辨率为144 DPI 此模式为默认模式。

FS ·                                退出汉字打印方式

格式:  ASCII: FS    ·

    十进制: 28   46

   十六进制: 1C   2E

说明:

  打印机接收到该命令后,退出汉字打印方式,转为正常的西文打印方式。

FS 2                                  用户自定义汉字

格式:  ASCII: FS    2   a1   a2 d1 d2 d3 …d32

    十进制: 28   50   248 a2 d1 d2 d3 …d32

   十六进制: 1C   32   F8   a2 d1 d2 d3   d32

说明:

  此功能为用户自定义汉字。

a1=F8(十六进制)

a2A1FE(十六进制)之间任意值。

因汉字代码为二字节,a1为第一字节,a2为第二字节,可定义94个汉字。

十六进制代码如下:

IC 32 77 21 00 00 38 20 20 20 20 20 24 20 24 20 24 21 24 21 E4 FF 24 20 25 20 26 20 24 20 20 20 20 20 38 20

FS ? c1   c2                         取消用户自定义汉字

格式:  ASCII: FS  ?    c1   c2

    十进制: 28   63   c1   c2

   十六进制: 1C   3F   c1   c2

说明:

c1c2指待定义字符的字符编码。c1c2的取值范围视采用的字符编码系统而定,如下表:

模式选择    C1    C2

日文汉字模式(JIS编码系统)    C1=77H    21H≤C2≤7EH

日文汉字模式(转换JIS编码系统)    C1=ECH    40H≤C2≤7EH80H≤C2≤9EH

简体汉字模式    C1=FEH    A1H≤C2≤FEH

繁体汉字模式    C1=FEH    A1H≤C2≤FEH

FS C n                           设定日文汉字编码系统

格式:  ASCII: FS  C    n

    十进制: 28   67   n

   十六进制: 1C   43   n

说明:

  n = 0, 1

n有如下定义:

n    日文汉字系统

0    JIS编码

1    转换JIS编码

默认n=0

FS  S n1   n2                             设定全角汉字字间距

格式:  ASCII: FS  S   n1   n2

    十进制: 28   83   n1   n2

   十六进制: 1C  53   n1   n2

说明:

0≤n1,n2≤127,n1决定字符左边间距,n2决定字符右边间距。

单位是1/160英寸,电源打开时的初始设定为n1=0,n2=2

FS  W  n                           设定/取消四倍角汉字模式

格式:  ASCII: FS  W   n

    十进制: 28   87   n

   十六进制: 1C  57   n

说明:

0≤n≤255

   nLSB位是0,取消四倍角汉字模式。

nLSB位是1,设置四倍角汉字模式。

默认n=0

GS ( F pL pH a m nL nH                   设置黑标定位偏移量

格式:  ASCII: GS ( F   pL pH a m nL nH    

十进制: 29 40 70 pL pH a m nL nH

  十六进制: 1D 28 46 pL pH a m nL nH  

说明:

该命令用于选择黑标定位控制允许,且设置切/撕纸位置或起始打

印位置相对于黑标检测的偏移量。该值以点数计算。

命令相关参数为:

pL+(pHx256)=4 pL=4,pH=0

1≤a≤2

m=0,48

0≤(nL+nHx256)<1700

l    a 用来选择设置切/撕纸位置或起始打印位置的偏移量。

a    功能

1    设置起始打印位置相对于黑标检测位置的偏移量

2    设置切/撕纸位置相对于黑标检测位置的偏移量

l    m=048,选择偏移量为前进纸方向计算;

l    nL,nH设置的偏移量对应实际距离为(nL+nHx256)×0.176mm

l    只有执行此命令后GS FF GS V命令有关黑标定位操作方有效;

l    设置起始打印位置偏移量(a=1)在执行GS FF 命令时有效;

l    设置切/撕纸位置偏移量(a=2)在执行GS V m 命令时有效;

l    默认值为nL=nH=0,即黑标检测开关检测到黑标时,当前票面上对应打印头的位置为设定的起始打印位置,当前票面上对应切/撕纸口的位置为设定的切/撕纸位置。

l    关于切/撕纸位置偏移量和起始打印位置偏移量的计算说明

1    /撕纸位置到黑标印刷位置的距离L与打印机的固有机械值L0相同,而且切/撕纸位置到起始打印位置的距离Q与打印机构固定的机械值Q0相同时,即用GS F命令所设置的偏移量均为0

2    当黑标印刷位置到切/纸位置的距离L小于打印的机械值L0时,GS F命令的切/撕纸位置偏移量计算为:

        /撕纸位置偏移量=L0—L/0.176(点数)

3    当黑标印刷位置到切/撕纸位置的距离L大于打印机的机械值L0时,GS F命令的切 /撕纸位置偏移量计算为:

        /撕纸位置偏移量=L0+相邻两黑标间的距离—L/0.176(点数)。

注意:在设置切/撕纸位置偏移量时,GS F命令的参数a应为2

4    当切/撕纸位置偏移量不为零或每单的起始打印位置到切/撕纸位置的距离Q大于打印机的机械值Q0)时,GS F命令的切/撕纸位置偏移量计算为:

        起始打印位置偏移量=Q—Q0/0.176 +/撕纸位置偏移量。

注意:在设置切/撕纸位置偏移量时,GS F命令的参数a应为1

5    打印结构M—U110051)的固有机械值

      L0=39mm,     Q0=11mm,

当打印机构安装在机壳内,使得撕纸位置和打印起始位置的固有机械值发生改变时

L0=39+L     Q0=11+L

6    L的测量方法如下:

1    先将空白打印纸装入打印机械,撕去出纸口上多余的打印纸

2    给打印机发20个字符“E”,打印在打印纸上

3    让打印机发走出足够长度,测量纸端到打印字符“EEEEEEEEEEEEEEEEEEEE”的上沿距离,该值减去11mm,即为△L。切/撕纸位置起始打印位置

GS  I  n                                  传送打印机ID

格式:  ASCII: GS  I   n

    十进制: 29   73   n

   十六进制: 1D  49   n

说明:

1 ≤n ≤3, 49 ≤n ≤51, 65 ≤n ≤69

n值定义如下:

n    打印机ID    规格    ID(十六进制)

149    打印机模式ID    TM200系列    0D

250    ID型号    见下表

351    ROM版本ID    ROM版本

65    硬件版本    取决于硬件版本

66    制造商    EPSON

67    打印机名称    TM200

68    打印机串号    取决于打印机串号

69    支持多国语言字符    日本模式:日本汉字中国模式:GB2312台湾模式:BIG-5泰国模式:THAI 3 PASS

GS V                                 走纸到切纸位置

格式:① ASCII: GS    V   m

    十进制: 29   86   m

十六进制: 1D   56   m

ASCII: GS    V   m   n

    十进制: 29   86   m   n

十六进制: 1D   56   m   n

说明:

m1,49。②m660≤n≤255

M          

149    部分切纸(无切刀则无切纸动作)

66    走纸到(切纸位置+n×1/144英寸)位置并部分切纸(无切纸刀则无切纸动作)

GS  a  n                             设定/取消自动返回状态

格式:  ASCII: GS  a    n

    十进制: 29   97   n

   十六进制: 1D  61   n

说明:

0≤n≤255n值定义如下表:

   功能    

       0    1

0    钱箱检测信号    取消    设定

1    联机    取消    设定

2    错误状态    取消    设定

3    进纸传感器状态    取消    设定

4    无定义        

5    无定义        

6    无定义        

7    无定义        

GS  r  n                                     状态传送

格式:  ASCII: GS  a    n

    十进制: 29   114   n

   十六进制: 1D  72   n

说明:

1 ≤n ≤2, 49 ≤n ≤50n值定义如下表:

n    功能

149    纸检测器状态

250    钱箱检测器状态

n=149时,传送字节定义如下:

   功能    

       0    1

0,1    纸检测信号    有纸    无纸

2,3    纸检测信号    有纸    无纸

4    无定义        

5    无定义        

6    无定义        

7    无定义        

n=250时,传送字节定义如下:

   功能    

       0    1

0    钱箱检测信号    低电平    低电平

1    联机        

2    无定义        

3    无定义        

4    无定义        

5    无定义        

6    无定义        

7    无定义        

GS  z  0   t1  t2                       设置联机恢复等待时间

格式:  ASCII: GS  z  0   t1  t2

    十进制: 29 122 48   t1  t2

   十六进制: 1D  7A 30 t1  t2

说明:

0 ≤t1 ≤2550 ≤t2 ≤255

设置进纸等待时间到大约t1 X 500ms,恢复确定时间到大约t2 X 500ms

t1=0时,一旦有纸插入,打印机即进入恢复确定状态。t2=0时,恢复确定时间取消。

命令(ASCII)    十六进制    功能说明

HT    9    打印位置进行到下一水平制表位置

LF    0a    打印行缓冲器里的内容,并向前走纸一行

CR    0D    打印回车

ESC SP    1B 20 n    设置字符右边的字间距为n个半点距(1/140英寸)

DLE EOT n    10 04    实时状态传送

DLE ENQ n    10 5    对打印机的实时请求

ESC SP n    1B 20 n    设置字符右间距

ESC ! n    1B 21 n    设置字符打印方式

ESC % n    1B 25 n    允许/禁止用户自定义字符

ESC &    1B 26    设置用户自定义字符

ESC *    1B 2A    设置图形点阵

ESC - n    1B 2D n    设置/取消下划线模式

ESC 2    1B 32    设定1/6英寸换行量

ESC 3  n    1B 33 n    设定 n/144英寸换行量

ESC 〈    1B 3C    打印头归位

ESC = n    1B 3D n    设备设置/取消

ESC n    1B 3F n    取消用户自定义字符

ESC @    1B 40    初始化打印机

ESC D NULL    1B 44 0    消除所有的水平制表位置

ESC E n    1B 45 0    设置/取消着重模式

ESC G n    1B 47 0    设置/取消重叠模式

ESC J n    1B 4A n    执行n/144英寸走纸

ESC K n    1B 4B n    打印并反向走纸

ESC R n    1B 52 n    选择国际字符集

ESC U n    1B 55 n    设置/取消单向打印

ESC a n    1B 61 n    选择对齐模式

ESC c 3 n    1B 63 33 n    输出纸尽传感器

ESC c 4  n    1B 63 34 n    设定缺纸时停止打印

ESC c 5  n    1B 63 35 n    允许/禁止走纸按键

ESC d n    1B 64 n    打印并进纸n字符行

ESC e n    1B 65 n    打印并反向进纸n字符行

ESC p    1B 70    产生钱箱驱动脉冲

ESC r n    1B 72 n    选择打印颜色

ESC t n    1B 73 n    选择字符集

ESC { n    1B 7B n    设置/取消倒向打印模式

FS     1B 75 n    汉字综合选择

FS     1C 26    进入汉字打印方式

FS ~   S    1C 7E 53 n    选择汉字打印速度

FS ·    1C 2E    退出汉字打印方式

FS 2    1C 32    用户自定义汉字

FS ? c1   c2    1C 3F c1 c2    取消用户自定义汉字

FS C n    1C 43 n    设定日文汉字编码系统

FS S n1 n2    1C 53 n1 n2    设定全角汉字字间距

FS W n    1C 57 n    设定/取消四倍角汉字模式

GS ( F pL pH a m nL nH    1D 28    设置黑标定位偏移量

GS  I  n    1D  49   n    传送打印机ID

GS V    1D   56   m    走纸到切纸位置

   1D   56 m n    

GS  a  n    1D  61   n    设定/取消自动返回状态

GS  r  n    1D  72   n    状态传送

GS  z    1D  7A    设置联机恢复等待时间


文档的内容比较多,我觉得可以需要打印什么格式什么内容的时候再进行参考。


Android POS开发

阅读数 3123

没有更多推荐了,返回首页