基于android的USB转串口通信

一、概述

      因为公司项目开发,需要在移动终端在开发一个usb转串口的数据通信,于是乎有了本次的记录。刚开始以为只需要在android上实现串口功能就行,后来发现,其实操作的是usb口,主要是对usb进行监听操作。

二、USB状态监听

      1、在xml中添加usb连接动作属性包括USB_DEVICE_ATTACHEDACTION_USB_DEVICE_DETACHED

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.ACTION_USB_DEVICE_DETACHED" />
        </intent-filter>
    </activity>
</application>

      2、注册广播,监测usb的拔插动作。

/**
 * 动态注册usb广播,拔插动作,注册动作
 * */
private void registerUsbSerial(){
    //注册在此service下的receiver的监听的action
    usbReceiver = new UsbSerialBroadcastReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
    intentFilter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
    intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
    intentFilter.addAction(USB_PERMISSION);
    registerReceiver(usbReceiver, intentFilter);//注册receiver

    //通知监听外设权限注册状态
    //PendingIntent:连接外设的intent
    //ask permission
    mPrtPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(USB_PERMISSION), 0);
}

      3、实现广播监听到的USB拔插动作

	if (USB_PERMISSION.equals(action)) {
            //Show_TvText_Str("xxxxx"+action);
        synchronized (this) {
            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
	            if ((UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) != null) {
	                Show_TvText_Str("getUsbInfo");
	            else 
	                Show_TvText_Str("USB外设意外消失。");
            } else {
                  	Show_TvText_Str("USB权限注册失败。");
                }
            }
        }
        // USB拔插动作
        else if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())){
            Show_TvText_Str("USB 插入...");
            //Search_UsbSerial();
        }else if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())){
            Show_TvText_Str("USB 已卸载...");
        }
   }

三、USB串口操作

      在完成usb状态监听后,接下来就是对串口本身的操作了。我们需要搜索可用的usb串口。
      1、搜索可用usb串口,这样操作后,需要获得系统的同意权限

/**
 * 搜索系统可用USB串口
 */
private int Search_UsbSerial()  {
    UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    final List<UsbSerialDriver> availableDrivers  = UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager);
    if (availableDrivers .isEmpty()) {
        //Show_TvText_Str(String.format("empty..."));
        return 0;
    }
    UsbSerialDriver driver = availableDrivers.get(0);
    //Show_TvText_Str(String.format("+ %s ", driver));
    usbSerialPort = driver.getPorts().get(0);
    RequestNormalPermission(mUsbManager,usbSerialPort.getDriver().getDevice()); //获得权限!!!!!!!!!
    return 1;
}

      2、获取系统对usb串口的操作权限

	/**
     * 请求权限:一般来说有弹框
     */
    public  void RequestNormalPermission(UsbManager usbManager,UsbDevice device) {
        if (!usbManager.hasPermission(device)) {
            Show_TvText_Str("printer dev has no permission,try request it!");
            usbManager.requestPermission(device, mPrtPermissionIntent);// will recall mReceiver
        } else {
            Show_TvText_Str("USB权限注册成功");
        }
    }

      3、获取到权限后,我们就可以打开usb串口实现操作了。
      4、剩下的就是基本的串口读写操作了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值