赞
踩
前言:
之前介绍了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();
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
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);
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
注意:
如果需要接受比较大的数据,有可能会遇到一个问题:数据缓存和接收时间不够,导致数据被覆盖或者丢失,我们就需要修改串口读取缓存了,把 SerialInputOutputManager 中的 READ_WAIT_MILLIS 和 BUFSIZ 改成合适的大小就可以了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。