最近在尝试写一个安卓版的无人机地面站,参考了DroidPlanner的代码,发现了一个很好用的串口通信组件usb-serial-for-android,免root权限,不需要NDK,不过只支持Android 3.1+。
github地址:https://github.com/mik3y/usb-serial-for-android
关于用法README.md中已经介绍得很详尽了,可以简单归结为以下几点:
1. 把usb-serial-for-android复制到工程中,Eclipse和Android Studio的处理方式各不相同,具体步骤可参考这里;
2. 复制device_filter.xml到工程的res/xml目录(没有则自行新建);
3. 配置AndroidManifest.xml;
1 <activity 2 android:name="..." 3 ...> 4 <intent-filter> 5 <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 6 </intent-filter> 7 <meta-data 8 android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 9 android:resource="@xml/device_filter" /> 10 </activity>
4. 编写代码。
1 // Find all available drivers from attached devices. 2 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 3 List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); 4 if (availableDrivers.isEmpty()) { 5 return; 6 } 7 8 // Open a connection to the first available driver. 9 UsbSerialDriver driver = availableDrivers.get(0); 10 UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); 11 if (connection == null) { 12 // You probably need to call UsbManager.requestPermission(driver.getDevice(), ..) 13 return; 14 } 15 16 // Read some data! Most have just one port (port 0). 17 UsbSerialPort port = driver.getPorts().get(0); 18 try { 19 port.open(connection); 20 port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); 21 22 byte buffer[] = new byte[16]; 23 int numBytesRead = port.read(buffer, 1000); 24 Log.d(TAG, "Read " + numBytesRead + " bytes."); 25 } catch (IOException e) { 26 // Deal with error. 27 } finally { 28 port.close(); 29 }
以下是我修改过的简单的例子(基于Android Studio 2.2.3)。
MainActivity.java
1 package com.stshdz.drone.shdrone; 2 3