Android 串口开发,发送串口命令,读卡,反扫码,USB通讯,实现demo。——持续更新

本文详细介绍了在Android环境下使用串口进行设备通信的方法,包括串口的连接与断开流程,并实现了从读卡器接收数据的完整过程。通过具体的代码示例,展示了如何获取串口设备路径、设置波特率以及处理读卡器返回的数据。

应用场景:APP发送串口命令到打印机,打印相应数据小票

// 串口
implementation 'com.github.licheedev.Android-SerialPort-API:serialport:1.0.1'

 1、获取全部串口地址devicePath

private String[] mDevices;
public void getcuankou(){
    SerialPortFinder serialPortFinder = new SerialPortFinder();
    mDevices = serialPortFinder.getAllDevicesPath();

    for (int c = 0;c<mDevices.length;c++){
        Log.i("lgq","......  "+mDevices[c]);
    }
}

2、连接串口,以及关闭串口

/**
 * 打开串口
 *
 * @param devicePath
 * @param baudrateString
 * @return
 */
public SerialPort open(String devicePath, String baudrateString) {
    if (mSerialPort != null) {
        close();
    }

    try {
        File device = new File(devicePath);
        int baurate = Integer.parseInt(baudrateString);
        mSerialPort = new SerialPort(device, baurate, 0);

        mReadThread = new SerialReadThread(mSerialPort.getInputStream());
        mReadThread.start();

        mOutputStream = mSerialPort.getOutputStream();

        mWriteThread = new HandlerThread("write-thread");
        mWriteThread.start();
        mSendScheduler = AndroidSchedulers.from(mWriteThread.getLooper());

        return mSerialPort;
    } catch (Throwable tr) {
        LogPlus.e(TAG, "打开串口失败", tr);
        close();
        return null;
    }
}

/**
 * 关闭串口
 */
public void close() {
    if (mReadThread != null) {
        mReadThread.close();
    }
    if (mOutputStream != null) {
        try {
            mOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (mWriteThread != null) {
        mWriteThread.quit();
    }

    if (mSerialPort != null) {
        mSerialPort.close();
        mSerialPort = null;
    }
}

Android接收读卡器以及扫码器返回数据实现方法

 工具类

public class CardSwipingHelper {
    private static final String TAG = CardSwipingHelper.class.getSimpleName();

    private static class SingletonHolder {
        private static final CardSwipingHelper INSTANCE = new CardSwipingHelper();
    }

    private CardSwipingHelper() {

    }

    public static final CardSwipingHelper getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private StringBuffer stringBuffer=null ;

    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {

            char pressedKey = (char) event.getUnicodeChar();
            if(stringBuffer==null){
                stringBuffer=new StringBuffer();
            }
            if (event.getUnicodeChar()==0){
                return false;
            }

            stringBuffer.append(pressedKey);
        }
        if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            if (mCardSwipingCallBack != null) {
                mCardSwipingCallBack.enterCardSwipingCont(replaceBlank(stringBuffer.toString()));
            }
            stringBuffer = null;
            return true;
        }
        return false;
    }

    private CardSwipingCallBack mCardSwipingCallBack;

    public void setCardSwipingCallBack(CardSwipingCallBack cardSwipingCallBack) {
        mCardSwipingCallBack = cardSwipingCallBack;

    }

    public interface CardSwipingCallBack {
        void enterCardSwipingCont(String cont);
    }
    public static String replaceBlank(String src) {
        String dest = "";
        if (src != null) {
            Pattern pattern = Pattern.compile("\t|\r|\n|\\s*");
            Matcher matcher = pattern.matcher(src);
            dest = matcher.replaceAll("");
        }
        return dest;
    }
}

回调

private CardSwipingHelper.CardSwipingCallBack mCardSwipingCallBack = new CardSwipingHelper.CardSwipingCallBack() {
    @Override
    public void enterCardSwipingCont(String cont) {

        try {
            String str2 = new String(cont.getBytes("utf-8"), "gbk");
            LgqLogutil.e("刷卡返回=====  "+cont+"...."+str2);

        tologin(cont);//刷卡登录
        }catch (Exception e){}
    }
};

//拦截刷卡的情况http://weixin.qq.com/r/Ti3s9NXE2oilrZGX93hchttp://weixin.qq.com/r/Ti3s9NXE2oilrZGX93hc
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (CardSwipingHelper.getInstance().dispatchKeyEvent(event)) {
        return true;
    }
    return super.dispatchKeyEvent(event);
}

CardSwipingHelper.getInstance().setCardSwipingCallBack(mCardSwipingCallBack);//扫码回调

注意:

EditText回拦截回调

USB连接 

action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter"

USB检测,权限
  <uses-permission android:name="android.permission.USB_PERMISSION" />
   private UsbManager usbManager;

 

        usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
        getUsbDevices();
    }

    private void getUsbDevices() {
        HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
        if (deviceList.isEmpty()) {
            Toast.makeText(this, "没有找到U盘", Toast.LENGTH_SHORT).show();
        } else {
            for (UsbDevice device : deviceList.values()) {
                String deviceName = device.getDeviceName();
                int deviceId = device.getDeviceId();
                Toast.makeText(this, "设备名称: " + deviceName + ", 设备ID: " + deviceId, Toast.LENGTH_SHORT).show();
            }
        }
    }

 权限

 private static final String ACTION_USB_PERMISSION = "com.example.usbreader.USB_PERMISSION";
    private UsbManager usbManager;
    private PendingIntent permissionIntent;

 

public class MainActivity extends Activity {
    private static final String ACTION_USB_PERMISSION = "com.example.usbreader.USB_PERMISSION";
    private UsbManager usbManager;
    private PendingIntent permissionIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
        permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        registerReceiver(usbReceiver, filter);

        getUsbDevices();
    }

    private void getUsbDevices() {
        HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
        if (deviceList.isEmpty()) {
            Toast.makeText(this, "没有找到U盘", Toast.LENGTH_SHORT).show();
        } else {
            for (UsbDevice device : deviceList.values()) {
                String deviceName = device.getDeviceName();
                int deviceId = device.getDeviceId();
                if (usbManager.hasPermission(device)) {
                    Toast.makeText(this, "设备名称: " + deviceName + ", 设备ID: " + deviceId, Toast.LENGTH_SHORT).show();
                } else {
                    usbManager.requestPermission(device, permissionIntent);
                }
            }
        }
    }

    private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (ACTION_USB_PERMISSION.equals(action)) {
                UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (device != null && intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    // 权限授予后处理设备
                    Toast.makeText(context, "已获得权限: " + device.getDeviceName(), Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "权限未获得", Toast.LENGTH_SHORT).show();
                }
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(usbReceiver);
    }
}

 在线回复bug:QQ1085220040

实现demo:https://download.youkuaiyun.com/download/meixi_android/12515052

demo云盘地址:百度网盘 请输入提取码

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值