2

I have a cordova 6 app for android, where I want to communicate with an Arduino, that is connected with USB. For this I use the cordovaarduino-Plugin, which uses usb-serial-for-android

Unfortunately I have a problem with my setup. Requesting permission works, but as soon as I try to actually open the serial connection, I see a Java-exception in the adb logcat: java.io.IOException: Error queueing request This means after I call serial.open neither the success, not the error-callback is called.

My android device: - Android 5.1.1 - Allwinner A33 Chipset

My serial devices: - Arduino Uno or Arduino Nano - Connected with usb to the Android

My Javascript-Code:

myApp.serial = {
  initialize: function(){
    // Arduino Nano China 1a86:7523
    // Arduino Uno original 2a03:0043
    var serial_device = {vid: '2a03',
      pid: '0043',
      //driver: 'CdcAcmSerialDriver'
      //driver: 'Ch34xSerialDriver'
      //driver: 'Cp21xxSerialDriver'
      //driver: 'FtdiSerialDriver'
      //driver: 'ProlificSerialDriver'      
    };
    serial.requestPermission( serial_device, this.initialize_success, this.initialize_error);
  },
  initialize_success: function(){
    toLog("Serial initialized", 4);
    var opts = { baudRate: 9600 };
    serial.open(opts, this.open_success, this.open_error);
  },
  initialize_error: function(){
    toLog("Error initializing serial!", 1);
  },
  open_success: function(){
    toLog("Serial connectino opened", 4);
    serial.registerReadCallback(this.on_serial_read, this.on_serial_read_error);
  },  
  open_error: function(){
    toLog("Error opening serial connection!", 1);
  }
}  

adb logcat

D/Serial  ( 3010): Action: requestPermission
D/UsbBroadcastReceiver( 3010): Permission to connect to the device was accepted!

I/chromium( 3010): [INFO:CONSOLE(3)] "Serial initialized", source: file:///android_asset/www/assets/javascripts/myapp.min.js (3)
D/Serial  ( 3010): Action: openSerial
D/CdcAcmSerialDriver( 3010): claiming interfaces, count=2
D/CdcAcmSerialDriver( 3010): Control iface=UsbInterface[mId=0,mAlternateSetting=0,mName=null,mClass=2,mSubclass=2,mProtocol=1,mEndpoints=[
D/CdcAcmSerialDriver( 3010): UsbEndpoint[mAddress=130,mAttributes=3,mMaxPacketSize=8,mInterval=255]]
D/CdcAcmSerialDriver( 3010): Control endpoint direction: 128
D/CdcAcmSerialDriver( 3010): Claiming data interface.
D/CdcAcmSerialDriver( 3010): data iface=UsbInterface[mId=1,mAlternateSetting=0,mName=null,mClass=10,mSubclass=0,mProtocol=0,mEndpoints=[
D/CdcAcmSerialDriver( 3010): UsbEndpoint[mAddress=4,mAttributes=2,mMaxPacketSize=64,mInterval=1]
D/CdcAcmSerialDriver( 3010): UsbEndpoint[mAddress=131,mAttributes=2,mMaxPacketSize=64,mInterval=1]]
D/CdcAcmSerialDriver( 3010): Read endpoint direction: 128
D/CdcAcmSerialDriver( 3010): Write endpoint direction: 0
D/CdcAcmSerialDriver( 3010): Async reads enabled
D/UsbRequestJNI( 3010): close
D/UsbRequestJNI( 3010): init
D/UsbRequestJNI( 3010): close
D/Serial  ( 3010): Serial port opened!
I/Serial  ( 3010): Stopping io manager.
I/SerialInputOutputManager( 3010): Stop requested
I/Serial  ( 3010): Starting io manager.
W/SerialInputOutputManager( 3010): Run ending due to exception: Error queueing request.
W/SerialInputOutputManager( 3010): java.io.IOException: Error queueing request.
W/SerialInputOutputManager( 3010):      at com.hoho.android.usbserial.driver.CdcAcmSerialDriver$CdcAcmSerialPort.read(CdcAcmSerialDriver.java:168)
W/SerialInputOutputManager( 3010):      at com.hoho.android.usbserial.util.SerialInputOutputManager.step(SerialInputOutputManager.java:159)
W/SerialInputOutputManager( 3010):      at com.hoho.android.usbserial.util.SerialInputOutputManager.run(SerialInputOutputManager.java:141)
W/SerialInputOutputManager( 3010):      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
W/SerialInputOutputManager( 3010):      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/SerialInputOutputManager( 3010):      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/SerialInputOutputManager( 3010):      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/SerialInputOutputManager( 3010):      at java.lang.Thread.run(Thread.java:818)
D/Serial  ( 3010): Runner stopped.
I/SerialInputOutputManager( 3010): Stopped.
I/SerialInputOutputManager( 3010): Running ..
D/UsbRequestJNI( 3010): init

None of the drivers seems to work. The logcat-messages are slightly different though.

Does this mean, my android device is not supported, or is there something that I can try?

Michael B
  • 1,660
  • 3
  • 28
  • 59

1 Answers1

0

Solution for Arduino:

port.dtr = true // for arduino, ...
port.rts = true

Java

port.setDTR(true);
port.setRTS(true);

https://github.com/kai-morich/SimpleUsbTerminal/blob/8841bde23a5a09ca36c64aa9e512e15955b54567/app/src/main/java/de/kai_morich/simple_usb_terminal/SerialSocket.java#L48

user924
  • 8,146
  • 7
  • 57
  • 139