前言:

    之前介绍了485串口传输数据,使用了https://github.com/cepr/android-serialport-api,本节课我们介绍usb串口数据传输。

使用usb串口传输数据的第三方库:https://github.com/mik3y/usb-serial-for-android

一、集成

1、首先我们下载下来demo,然后找到里面的usbSerialForAndroid这个库,我们可以源码依赖。

2、新建你自己的项目, 然后倒入usbSerialForAndroid这个module,然后在app底下的build.gradle中加入:

compile project(':usbSerialForAndroid')

这时候库就倒进来了, 不过不要忘记改掉库中的compileSdkVersion和buildToolsVersion两个变量,改成跟你建的app下的版本相同。

3、删掉库中作者上传至自己私有服务器的代码, 留以下代码即可:

 4、在工程的res下建目录xml,  device_filter.xml文件复制到自己的工程, 这一步直接从demo里复制过来就好了

5、在AndroidManifest.xml中添加如下代码:

第一个是添加操作usb串口的权限, 第二个是添加在你要操作usb串口的界面中,意思是当一个usb设备插入后,会通知此activity

二、使用

1、读写

// Find all available drivers from attached devices.
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
  return;
}

// Open a connection to the first available driver.
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
  // You probably need to call UsbManager.requestPermission(driver.getDevice(), ..)
  return;
}

// Read some data! Most have just one port (port 0).
UsbSerialPort port = driver.getPorts().get(0);
try {
  port.open(connection);
  port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);

  byte buffer[] = new byte[16];
  int numBytesRead = port.read(buffer, 1000);
  Log.d(TAG, "Read " + numBytesRead + " bytes.");
} catch (IOException e) {
  // Deal with error.
} finally {
  port.close();
}

2、监听usb

private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
private SerialInputOutputManager mSerialIoManager;

private final SerialInputOutputManager.Listener mListener =
    new SerialInputOutputManager.Listener() {
        @Override
        public void onRunError(Exception e) {
            Log.d(TAG, "Runner stopped.");
        }
                 
        @Override
        public void onNewData(final byte[] data) {
            //TODO 新的数据
        }
};
 
mSerialIoManager = new SerialInputOutputManager(sPort, mListener);//添加监听
//在新的线程中监听串口的数据变化
mExecutor.submit(mSerialIoManager);

注意:

如果需要接受比较大的数据,有可能会遇到一个问题:数据缓存和接收时间不够,导致数据被覆盖或者丢失,我们就需要修改串口读取缓存了,把 SerialInputOutputManager 中的 READ_WAIT_MILLIS 和 BUFSIZ 改成合适的大小就可以了

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐