I am developing one application for reading sensor data from an Android device through an Arduino. I am able to setup communication and read that data. That data is coming from Arduino in a byte array via a USB cable.
From that array of bytes, I am reading it into a bytes and displaying on an Android device and when I received all data from Arduino I am sending output to the Arduino. It blinks an LED. Between this communication I am getting a one second delay. How do I reduce that delay in communication?
My Code for receiving data from arduino to android is:
public void run() {
int ret = 0;
//byte[] buffer = new byte[16384];
byte[] buffer = new byte[65536];
int i;
i = 0;
while(i<1){
try {
startSendHandshakeDataExecTime = System.currentTimeMillis();
ret = mInputStream.read(buffer);
for(int a=0;a<noOfFlowSensors;a++){
intListFlowBytes.add((int)buffer[a]);
}
for(int b=0;b<noOfAnalogSensors;b++){
intListAnalogBytes.add((int)buffer[noOfFlowSensors+b]);
}
for(int c=0;c<noOfSwitches;c++){
intListSwitchesBytes.add((int)buffer[noOfFlowSensors+noOfAnalogSensors+c]);
}
/*for (int n = 0; n <noOfFlowSensors + noOfAnalogSensors + noOfSwitches; n++)
{*/
endSendHandshakeDataExecTime = System.currentTimeMillis();
Message m = Message.obtain(mHandlerHandShake);
//m.obj = new TelemetryPacket(composeInt(buffer[i + 1],buffer[i + 2]));
//m.obj = new ValueMsg('f',ret,buffer[0],composeInt(buffer[1],buffer[2]),buffer[3],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
// m.obj = new ValueMsg('f',ret,buffer[0],buffer[1],buffer[2],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
m.obj = new ValueMsgHandShake(""+(endSendHandshakeDataExecTime-startSendHandshakeDataExecTime),ret,intListFlowBytes,intListAnalogBytes,intListSwitchesBytes,1);
mHandlerHandShake.sendMessage(m);
// }
mInputStream.close();
break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while (true) { // read data
try {
startTime = System.currentTimeMillis();
startReceiveDataExecTime = System.currentTimeMillis();
ret = mInputStream.read(buffer);
for(int p=0;p<noOfFlowSensors;p++){
intListFlowValues.add((int)buffer[p]);
//intPulseValues = (int)buffer[p];
}
Message mPulse = Message.obtain(mHandlerPulseSensors);
//m.obj = new TelemetryPacket(composeInt(buffer[i + 1],buffer[i + 2]));
//m.obj = new ValueMsg('f',ret,buffer[0],composeInt(buffer[1],buffer[2]),buffer[3],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
// m.obj = new ValueMsg('f',ret,buffer[0],buffer[1],buffer[2],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
mPulse.obj = new ValueMsgPulseSensors("f",ret,intListFlowValues);
mHandlerPulseSensors.sendMessage(mPulse);
for(int a=0;a<2*noOfAnalogSensors;a=a+2){
intListAnalogValues.add((int)(composeInt(buffer[noOfFlowSensors+a],buffer[noOfFlowSensors+a+1])));
// intAnalogValues = (int)buffer[composeInt(buffer[noOfFlowSensors+a],buffer[noOfFlowSensors+a+1])];
}
Message mAnalog = Message.obtain(mHandlerAnalogSensors);
//m.obj = new TelemetryPacket(composeInt(buffer[i + 1],buffer[i + 2]));
//m.obj = new ValueMsg('f',ret,buffer[0],composeInt(buffer[1],buffer[2]),buffer[3],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
// m.obj = new ValueMsg('f',ret,buffer[0],buffer[1],buffer[2],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
mAnalog.obj = new ValueMsgAnalogSensors("f",ret,intListAnalogValues);
mHandlerAnalogSensors.sendMessage(mAnalog);
for(int l=0;l<noOfSwitches;l++){
intListSwitchesValues.add( (int)buffer[noOfFlowSensors+2*noOfAnalogSensors+l]);
//intSwitchValues = (int)buffer[noOfFlowSensors*intListFlowBytes.size()+intListAnalogBytes.size()*noOfAnalogSensors+l];
}
Message mSwitch = Message.obtain(mHandlerSwitchSensors);
//m.obj = new TelemetryPacket(composeInt(buffer[i + 1],buffer[i + 2]));
//m.obj = new ValueMsg('f',ret,buffer[0],composeInt(buffer[1],buffer[2]),buffer[3],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
// m.obj = new ValueMsg('f',ret,buffer[0],buffer[1],buffer[2],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
mSwitch.obj = new ValueMsgSwitchSensors("f",ret,intListSwitchesValues);
mHandlerSwitchSensors.sendMessage(mSwitch);
/* int intEnd=(int)buffer[noOfFlowSensors+noOfAnalogSensors+noOfSwitches+1];
for (int n = 0; n <noOfFlowSensors + noOfAnalogSensors + noOfSwitches; n++)
{
Message m = Message.obtain(mHandler);
//m.obj = new TelemetryPacket(composeInt(buffer[i + 1],buffer[i + 2]));
//m.obj = new ValueMsg('f',ret,buffer[0],composeInt(buffer[1],buffer[2]),buffer[3],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
// m.obj = new ValueMsg('f',ret,buffer[0],buffer[1],buffer[2],composeInt(buffer[4],buffer[5]),buffer[6],composeInt(buffer[7],buffer[8]),buffer[9],composeInt(buffer[10],buffer[11]),buffer[12],buffer[13],buffer[14],buffer[15]);
m.obj = new ValueMsg1('f',ret,intListFlowValues,intListAnalogValues,intListSwitchesValues,intEnd);
mHandler.sendMessage(m);
// }
*/
i += 1;
endReceiveDataExecTime = System.currentTimeMillis();
Message mReceivedDataDelay = Message.obtain(mHandlerReceiveDataDelay);
mReceivedDataDelay.obj = new ValueMsgReceivedDataDelay(""+ (endReceiveDataExecTime-startReceiveDataExecTime));
mHandlerReceiveDataDelay.sendMessage(mReceivedDataDelay);
mInputStream.close();
OutputDataAfterDataReceived();
} catch (IOException e) {
break;
}
}
//sendOutputData();
}
The behavior you are describing appears to be the auto-reset on serial issue described in this post: https://stackoverflow.com/a/10921900/1440715
The Arduino automatically resets when it receives serial communication from most things other than the Arduino IDE. This is why you can send from the IDE but not from anything else (without special care).
I have an Uno and put a capacitor between Reset and Ground. Here’s a page with some good info on the subject.
Good luck. http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection