Skip to content

4. Asynchronous api

Felipe Herranz edited this page Feb 21, 2019 · 4 revisions

Asynchronous api example

Remember to check the example module for a complete example

Use

Now that we already have our UsbSerialDevice object this is what needs to be done in order to use the Asynchronous api

UsbSerialDevice serial = UsbSerialDevice.createUsbSerialDevice(device, usbConnection); 
...
serial.open();
serial.setBaudRate(115200);
serial.setDataBits(UsbSerialInterface.DATA_BITS_8);
serial.setParity(UsbSerialInterface.PARITY_ODD);
serial.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); 

Flow control is also supported in CP210x and FTDI devices

/**
Values:
    UsbSerialInterface.FLOW_CONTROL_OFF
    UsbSerialInterface.FLOW_CONTROL_RTS_CTS 
    UsbSerialInterface.FLOW_CONTROL_DSR_DTR
**/
serial.setFlowControl(UsbSerialInterface.FLOW_CONTROL_RTS_CTS);

Reading from the serial port is performed through a callback. Note that this callback is not executed in the UI thread. That means you can't touch anything UI related here.

private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {

		@Override
		public void onReceivedData(byte[] arg0) 
		{
			// Code here :)
		}
		
};

Pass a mCallback reference to the UsbSerialDevice object

serial.read(mCallback);

Now, write something

serial.write("DATA".getBytes());

You can also set RTS and DTR signals

serial.setRTS(true); // Raised
serial.setRTS(false); // Not Raised
serial.setDTR(true); // Raised
serial.setDTR(false); // Not Raised

Changes in the CTS and DSR lines will be received in the same manner. Define a callback and pass a reference of it.

private UsbSerialInterface.UsbCTSCallback ctsCallback = new UsbSerialInterface.UsbCTSCallback() {
        @Override
        public void onCTSChanged(boolean state) {
           // Code here :)
        }
    };
    
private UsbSerialInterface.UsbDSRCallback dsrCallback = new UsbSerialInterface.UsbDSRCallback() {
        @Override
        public void onDSRChanged(boolean state) {
           // Code here :)
        }
    };
    
serial.getCTS(ctsCallback);
//serial.getDSR(dsrCallback);

When you are done, close the device

serial.close();

Supported baud rates

300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600

Split information

Sometimes received information is split between calls. You can use ProtocolBuffer class for appending data

ProtocolBuffer buffer = new ProtocolBuffer(ProtocolBuffer.TEXT); //Also Binary 
buffer.setDelimiter("\r\n");
...
private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {

		@Override
		public void onReceivedData(byte[] arg0) 
		{
                        buffer.appendData(arg0);
                        while(buffer.hasMoreCommands()){
                            String textCommand = buffer.nextTextCommand()
                            // Do your thing with textCommand
                        }
		}
		
};