2019-11-15 15:09:41 -08:00
|
|
|
[![Actions Status](https://github.com/mik3y/usb-serial-for-android/workflows/build/badge.svg)](https://github.com/mik3y/usb-serial-for-android/actions)
|
2019-10-12 02:37:35 -07:00
|
|
|
[![Jitpack](https://jitpack.io/v/mik3y/usb-serial-for-android.svg)](https://jitpack.io/#mik3y/usb-serial-for-android)
|
|
|
|
[![Codacy](https://api.codacy.com/project/badge/Grade/4d528e82e35d42d49f659e9b93a9c77d)](https://www.codacy.com/manual/kai-morich/usb-serial-for-android-mik3y?utm_source=github.com&utm_medium=referral&utm_content=mik3y/usb-serial-for-android&utm_campaign=Badge_Grade)
|
2019-10-20 13:12:56 -07:00
|
|
|
[![codecov](https://codecov.io/gh/mik3y/usb-serial-for-android/branch/master/graph/badge.svg)](https://codecov.io/gh/mik3y/usb-serial-for-android)
|
2019-10-12 02:37:35 -07:00
|
|
|
|
2019-10-06 01:19:04 -07:00
|
|
|
# usb-serial-for-android
|
|
|
|
|
|
|
|
This is a driver library for communication with Arduinos and other USB serial hardware on
|
|
|
|
Android, using the
|
|
|
|
[Android USB Host Mode (OTG)](http://developer.android.com/guide/topics/connectivity/usb/host.html)
|
|
|
|
available since Android 3.1 and working reliably since Android 4.2.
|
|
|
|
|
|
|
|
No root access, ADK, or special kernel drivers are required; all drivers are implemented in
|
|
|
|
Java. You get a raw serial port with `read()`, `write()`, and other basic
|
|
|
|
functions for use with your own protocols.
|
|
|
|
|
|
|
|
## Quick Start
|
|
|
|
|
2019-10-06 01:31:34 -07:00
|
|
|
**1.** Add library to your project:
|
|
|
|
|
|
|
|
Add jitpack.io repository to your root build.gradle:
|
2019-10-12 02:37:35 -07:00
|
|
|
```gradle
|
2019-10-06 01:31:34 -07:00
|
|
|
allprojects {
|
|
|
|
repositories {
|
|
|
|
...
|
|
|
|
maven { url 'https://jitpack.io' }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
Add library to dependencies
|
2019-10-12 02:37:35 -07:00
|
|
|
```gradle
|
2019-10-06 01:31:34 -07:00
|
|
|
dependencies {
|
|
|
|
implementation 'com.github.mik3y:usb-serial-for-android:Tag'
|
|
|
|
}
|
|
|
|
```
|
2019-10-06 01:19:04 -07:00
|
|
|
|
2019-10-26 12:32:28 -07:00
|
|
|
**2.** If the app should be notified when a device is attached, add
|
|
|
|
[device_filter.xml](https://github.com/mik3y/usb-serial-for-android/blob/master/usbSerialExamples/src/main/res/xml/device_filter.xml)
|
|
|
|
to your project's `res/xml/` directory and configure in your `AndroidManifest.xml`.
|
2019-10-06 01:19:04 -07:00
|
|
|
|
|
|
|
```xml
|
|
|
|
<activity
|
|
|
|
android:name="..."
|
|
|
|
...>
|
2019-10-26 12:32:28 -07:00
|
|
|
<intent-filter>
|
|
|
|
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
|
|
|
|
</intent-filter>
|
|
|
|
<meta-data
|
|
|
|
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
|
|
|
|
android:resource="@xml/device_filter" />
|
2019-10-06 01:19:04 -07:00
|
|
|
</activity>
|
|
|
|
```
|
|
|
|
|
2019-10-26 12:32:28 -07:00
|
|
|
**3.** Use it! Example code snippet:
|
2019-10-06 01:19:04 -07:00
|
|
|
|
2019-11-15 15:09:41 -08:00
|
|
|
open device:
|
2019-10-06 01:19:04 -07:00
|
|
|
```java
|
2019-10-26 12:32:28 -07:00
|
|
|
// 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;
|
|
|
|
}
|
2019-10-06 01:19:04 -07:00
|
|
|
|
2019-10-26 12:32:28 -07:00
|
|
|
// Open a connection to the first available driver.
|
|
|
|
UsbSerialDriver driver = availableDrivers.get(0);
|
|
|
|
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
|
|
|
|
if (connection == null) {
|
|
|
|
// add UsbManager.requestPermission(driver.getDevice(), ..) handling here
|
|
|
|
return;
|
|
|
|
}
|
2019-10-06 01:19:04 -07:00
|
|
|
|
2019-10-26 12:32:28 -07:00
|
|
|
UsbSerialPort port = driver.getPorts().get(0); // Most devices have just one port (port 0)
|
|
|
|
port.open(connection);
|
|
|
|
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
|
|
|
|
```
|
2019-11-15 15:09:41 -08:00
|
|
|
then use direct read/write
|
2019-10-26 12:32:28 -07:00
|
|
|
```java
|
2019-11-15 15:09:41 -08:00
|
|
|
port.write(request, WRITE_WAIT_MILLIS);
|
|
|
|
len = port.read(response, READ_WAIT_MILLIS);
|
2019-10-26 12:32:28 -07:00
|
|
|
```
|
2019-11-15 15:09:41 -08:00
|
|
|
or direct write + event driven read:
|
2019-10-26 12:32:28 -07:00
|
|
|
```java
|
2019-11-15 15:09:41 -08:00
|
|
|
usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
|
|
|
|
Executors.newSingleThreadExecutor().submit(usbIoManager);
|
|
|
|
...
|
|
|
|
port.write("hello".getBytes(), WRITE_WAIT_MILLIS);
|
|
|
|
|
2019-10-26 12:32:28 -07:00
|
|
|
@Override
|
|
|
|
public void onNewData(byte[] data) {
|
|
|
|
runOnUiThread(() -> { textView.append(new String(data)); });
|
2019-10-06 01:19:04 -07:00
|
|
|
}
|
|
|
|
```
|
2019-11-15 15:09:41 -08:00
|
|
|
and finally:
|
2019-10-26 12:32:28 -07:00
|
|
|
```java
|
|
|
|
port.close();
|
|
|
|
```
|
2019-10-06 01:19:04 -07:00
|
|
|
|
2019-10-26 12:32:28 -07:00
|
|
|
For a simple example, see
|
|
|
|
[UsbSerialExamples](https://github.com/mik3y/usb-serial-for-android/blob/master/usbSerialExamples)
|
|
|
|
folder in this project.
|
2019-10-06 01:19:04 -07:00
|
|
|
|
2020-03-23 12:11:39 -07:00
|
|
|
For a more complete example with background service to stay connected while
|
|
|
|
the app is not visible or rotating, see separate github project
|
2019-10-26 12:32:28 -07:00
|
|
|
[SimpleUsbTerminal](https://github.com/kai-morich/SimpleUsbTerminal).
|
2019-10-06 01:19:04 -07:00
|
|
|
|
|
|
|
## Probing for Unrecognized Devices
|
|
|
|
|
|
|
|
Sometimes you may need to do a little extra work to support devices which
|
|
|
|
usb-serial-for-android doesn't (yet) know about -- but which you know to be
|
|
|
|
compatible with one of the built-in drivers. This may be the case for a brand
|
|
|
|
new device or for one using a custom VID/PID pair.
|
|
|
|
|
|
|
|
UsbSerialProber is a class to help you find and instantiate compatible
|
|
|
|
UsbSerialDrivers from the tree of connected UsbDevices. Normally, you will use
|
|
|
|
the default prober returned by ``UsbSerialProber.getDefaultProber()``, which
|
|
|
|
uses the built-in list of well-known VIDs and PIDs that are supported by our
|
|
|
|
drivers.
|
|
|
|
|
|
|
|
To use your own set of rules, create and use a custom prober:
|
|
|
|
|
|
|
|
```java
|
|
|
|
// Probe for our custom CDC devices, which use VID 0x1234
|
|
|
|
// and PIDS 0x0001 and 0x0002.
|
|
|
|
ProbeTable customTable = new ProbeTable();
|
|
|
|
customTable.addProduct(0x1234, 0x0001, CdcAcmSerialDriver.class);
|
|
|
|
customTable.addProduct(0x1234, 0x0002, CdcAcmSerialDriver.class);
|
|
|
|
|
|
|
|
UsbSerialProber prober = new UsbSerialProber(customTable);
|
|
|
|
List<UsbSerialDriver> drivers = prober.findAllDrivers(usbManager);
|
|
|
|
// ...
|
|
|
|
```
|
|
|
|
|
|
|
|
Of course, nothing requires you to use UsbSerialProber at all: you can
|
|
|
|
instantiate driver classes directly if you know what you're doing; just supply
|
|
|
|
a compatible UsbDevice.
|
|
|
|
|
|
|
|
## Compatible Devices
|
|
|
|
|
|
|
|
This library supports USB to serial converter chips:
|
|
|
|
* FTDI FT232, FT2232, ...
|
|
|
|
* Prolific PL2303
|
|
|
|
* Silabs CP2102, CP2105, ...
|
|
|
|
* Qinheng CH340
|
|
|
|
|
|
|
|
and devices implementing the CDC/ACM protocol like
|
|
|
|
* Arduino using ATmega32U4
|
|
|
|
* Digispark using V-USB software USB
|
|
|
|
* BBC micro:bit using ARM mbed DAPLink firmware
|
|
|
|
* ...
|
|
|
|
|
|
|
|
## Author, License, and Copyright
|
|
|
|
|
|
|
|
usb-serial-for-android is written and maintained by *mike wakerly* and *kai morich*
|
|
|
|
|
|
|
|
This library is licensed under *LGPL Version 2.1*. Please see LICENSE.txt for the
|
|
|
|
complete license.
|
|
|
|
|
|
|
|
Copyright 2011-2012, Google Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
Portions of this library are based on [libftdi](http://www.intra2net.com/en/developer/libftdi).
|
|
|
|
Please see FtdiSerialDriver.java for more information.
|
|
|
|
|
|
|
|
## Help & Discussion
|
|
|
|
|
|
|
|
For common problems, see the
|
|
|
|
[Troubleshooting](https://github.com/mik3y/usb-serial-for-android/wiki/Troubleshooting)
|
|
|
|
wiki page.
|
|
|
|
|
2019-10-12 02:37:35 -07:00
|
|
|
Are you using the library? Add your project to
|
2019-10-06 01:19:04 -07:00
|
|
|
[ProjectsUsingUsbSerialForAndroid](https://github.com/mik3y/usb-serial-for-android/wiki/Projects-Using-usb-serial-for-android).
|