0
votes

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();

    }
2
posting some of your code may help us understand what is happeningMoog
Might be a buffering issue. Can you explicitly flush any output buffers on both ends?JimmyB
yes I am flushing output buffers explicitly. is this creating a problem?ashokk

2 Answers

0
votes

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

0
votes

Two simple solutions that are guaranteed to work for anyone who is still looking. In arduino code:-

  1. Increase the delay to 50 to 100 milliseconds.

  2. Add this after the Serial.begin(9600) in setup();

    Serial.setTimeout(50);
    

Step two is the most important. It worked for me only after I added the above code. This is not mentioned very often in many other forums that I have looked when I had the exact same problem.