Although I talked some months ago about this library and I even use it for DroidTerm, DroidTerm PRO and other professional projects, the post I wrote no reflects the truly current state of this work. It is fairly stable and has been used So here it is, a more formal and helpful description of UsbSerial for Android.
A brief list of Apps and wrappers using UsbSerial. Contact with me if you have a nice project to show 🙂
UsbSerial repository
If UsbSerial fits your needs and have help you with your project, please consider donating via PayPal to boost further improvements
If you are relatively new using Android, or just Usb Android api just checkout this simple app using UsbSerial with full source code available on Github
Or you can check out this amazing post about using the USB android API by the guys of BLECentral. The previous steps to use UsbSerial are very well explained there.
Another awesome tutorial by Hariharan Mathavan from All About Circuits
How to add UsbSerial to your project
Thanks to StephaneBg UsbSerial can be easily added to your Android Studio project via Jitpack. First add the jitpack repo into your project build.gradle.
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
And then add the dependency to your module’s build.gradle
compile 'com.github.felHR85:UsbSerial:4.5'
Devices supported
Currently UsbSerial supports three of the most used USB to serial chipsets:
– FTDI FT232 (I am not going to brick your device, trust me 🙂)
– Silicon Labs CP210x
– Prolific PL2303HX (at least HX version)
– CH340/CH341
A new feature added here is a CDC generic driver, so it should be possible to connect devices which fits into Communications Device Class. I am open to suggestions about new supported chipsets.
UsbSerial internals: A brief description
– Internally UsbSerial works as a Producer-Consumer handler, Â what you write is put into a buffer and it will be consumed by a Consumer thread when previous data is sent.
– Write operations can be queued from multiple threads without problems
– Received data is received through a callback, there is no need to be polling.
– Two 16kb internal buffers for Write and Read operations.
– Android 4.2.1 Â or greater devices rely on Asynchronous USB api for read operations. Prior versions (Android 3.1 oldest version supported) use synchronous api due to some Android bugs. Write operations use always synchronous USB api. UsbSerial handles all of this so there is no need to worry.
– PL2303, FT232 and CP210x drivers use a list of known vid and pids to identify a correct device.
– CDC driver can be loaded automatically for a device if it has a CDC interface.
How to use it
First of all you need both UsbDevice and UsbDeviceConnection objects correctly initialized.
// This snippet will open the first usb device connected, excluding usb root hubs
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbDevice device;
UsbDeviceConnection connection;
HashMap<String, UsbDevice> usbDevices = usbManager.getDeviceList();
if(!usbDevices.isEmpty())
{
boolean keep = true;
for(Map.Entry<String, UsbDevice> entry : usbDevices.entrySet())
{
device = entry.getValue()
int deviceVID = device.getVendorId()
int devicePID = device.getProductId()
if(deviceVID != 0x1d6b || (devicePID != 0x0001 || devicePID != 0x0002 || devicePID != 0x0003))
{
// We are supposing here there is only one device connected and it is our serial device
connection = usbManager.openDevice(device);
keep = false;
}else
{
connection = null;
device = null;
}
if(!keep)
break;
}
}
With those objects correctly initialized it is easy to start
// A callback for received data must be defined
private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback()
{
@Override
public void onReceivedData(byte[] arg0)
{
// Code here
}
};
//...
//...
UsbSerialDevice serialPort = UsbSerialDevice.createUsbSerialDevice(device, mConnection);
if(serialPort != null)
{
if(serialPort.open())
{
// Devices are opened with default values, Usually 9600,8,1,None,OFF
// CDC driver default values 115200,8,1,None,OFF
serialPort.setBaudRate(115200);
serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8);
serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1);
serialPort.setParity(UsbSerialInterface.PARITY_NONE);
serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
serialPort.read(mCallback);
}else
{
// Serial port could not be opened, maybe an I/O error or it CDC driver was chosen it does not really fit
}
}else
{
// No driver for given device, even generic CDC driver could not be loaded
}
And write what you want to send through serial port!
serialPort.write("Hola!".getBytes());
If you need to use flow control signals just check out this post
UsbSerial now allows USB to SPI bridges
Download the jar file here Actually it is better to add UsbSerial using gradle as described above!!
Happy coding and reach me if you do something nice with UsbSerial! 🙂
Update (03/07/15):
Thanks to Martin Blom now it is possible to use UsbSerial with multi-interface devices (like this). The best way would be
int iface = 0;
UsbSerialDevice serialPort = UsbSerialDevice.createUsbSerialDevice(device, mConnection, iface);