Android 打印机----》使用android串口以及ESC/POS指令进行小票打印

本文介绍了在Android环境下使用串口通信和ESC/POS指令进行小票打印的方法,包括开发环境配置、串口通信集成、ESC/POS指令的使用,以及实现一票一证功能来确保打印的稳定性和可靠性。详细阐述了丢票原因及一票一证的解决方案,并提供了数据发送任务与收银任务的流程图。
摘要由CSDN通过智能技术生成

开发环境

  1.    Android studio 3.5.1
  2.   gradle版本3.5.1
  3.   android 编译版本 28
  4.    jdk1.8
  5.    win7

开发准备

  1.  对android 串口通信有一定了解
  2.  对ESC/POS指令有一定了解    

串口

  1. 下载google的串口demo https://code.google.com/archive/p/android-serialport-api/source/default/source
  2. 集成演示

将google串口demo中的SO库到就jniLibs下,同时将串口工具类放到自己的项目中,注意包名一致,也可以自己改;需要配置ndk相关。

做完以上步骤还需要编写一个串口工具类方便调用,提供一个示例供参考,根据实际需求而修改即可

public class SerialManager {

    private final static String TAG="SerialManager";

    public static final String PATH="/dev/ttyS2";
    public static final int BAUTRATE=115200;
    protected OutputStream mOutputStream;
    private InputStream mInputStream;
    protected SerialPortTool serialPortTool;
    protected SerialPort mSerialPort;

    private ReadThread mReadThread;
    private boolean isStop=false;
    private OnDataReceiveListener onDataReceiveListener=null;


    private enum Singleton {
        INSTANCE;

        private final SerialManager client;

        Singleton() {
            client = new SerialManager();
        }

        private SerialManager getInstance() {
            return client;
        }
    }

    public static SerialManager getClient() {

        return Singleton.INSTANCE.getInstance();
    }

    public interface OnDataReceiveListener {
        public void onDataReceive(byte[] buffer, int size);
    }

    public void setOnDataReceiveListener(OnDataReceiveListener dataReceiveListener) {
        onDataReceiveListener=dataReceiveListener;
    }

    /**
     * Name:open Function:open printer
     *
     * @return true:sucessful;false:failed
     */
    public boolean open() {
        boolean bRet=true;
        if (serialPortTool == null)
            serialPortTool=new SerialPortTool ();
        try {
            mSerialPort=serialPortTool.getSerialPort (PATH, BAUTRATE);
            mOutputStream=mSerialPort.getOutputStream ();
            mInputStream=mSerialPort.getInputStream ();
            mReadThread=new ReadThread ();
            isStop=false;
            mReadThread.start ();
            bRet=true;
        } catch (SecurityException e) {

        } catch (IOException e) {

        } catch (InvalidParameterException e) {

        } catch (Exception e) {

        }
        return bRet;
    }

    /**
     * Name:close; Function:close printer
     */
    public void close() {
        isStop=true;
        if (mReadThread != null) {
            mReadThread.interrupt ();
        }
        if (serialPortTool != null)
            serialPortTool.closeSerialPort ();
        mSerialPort=null;
    }

 
    public static String Bytes2HexString(byte[] b) {
        String ret="";

        for (int i=0; i < b.length; ++i) {
            String hex=Integer.toHexString (b[i] & 255);
            if (hex.length () == 1) {
                hex='0' + hex;
            }

            ret=ret + " " + hex.toUpperCase ();
        }
        return ret;
    }

    /**
     * Name:escCommand
     * Function:send ESC command
     *
     * @param cmd
     * @return
     */
    public boolean escCommand(String cmd) {
        if (cmd == null || cmd.length () == 0)
            return false;

        byte[] buffer=cmd.getBytes ();
        return escCommand (buffer);
    }

    public boolean escCommand(byte[] cmd) {
        Log.e (TAG, "escCommand: "+Bytes2HexString (cmd));
        boolean bRet=true;
        try {
            if (cmd != null && cmd.length > 0) {
                mOutputStream.write (cmd);
            }
        } catch (Exception ex) {
            bRet=false;
        }
        return bRet;
    }

    public boolean escCommand(byte[] cmd, int count) {
        boolean bRet=true;
        try {
            if (cmd != null && cmd.length > 0) {
                mOutputStream.write (cmd, 0, count);
            }
        } catch (Exception ex) {
            bRet=false;
            Log.e ("escCommand", ex.getLocalizedMessage ());
        }
        return bRet;
    }

    public InputStream getInputStream(){
        return mInputStream;
    }

    public OutputStream getOutputStream(){
        return mOutputStream;
    }

    private class ReadThread extends Thread {

        @Override
        public void run() {
            super.run ();
            while (!isStop && !isInterrupted ()) {
                int size;
                try {
                    if (mInputStream == null)
                        return;
                    int ret=mInputStream.available ();
                    Thread.sleep (15);
                    byte[] buffer=new byte[ret];
                    if (ret > 0) {
                        size=mInputStream.read (buffer);
                        if (null != onDataReceiveListener) {
                            onDataReceiveListener.onDataReceive (buffer, size);
                        }
                    }
                    Thread.sleep (15);
                } catch (Exception e) {
                    e.printStackTrace ();
                    return;
                }
            }
        }
    }

}

ESC/POS指令

我们需要打印一个带二维码的小票,

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值