0

Arduinoを介してAndroidデバイスからセンサーデータを読み取るための1つのアプリケーションを開発しています。通信を設定してそのデータを読み取ることができます。そのデータは、USBケーブルを介してバイト配列でArduinoから送られてきます。

そのバイトの配列から、それをバイトに読み込んでAndroidデバイスに表示し、Arduinoからすべてのデータを受信すると、Arduinoに出力を送信します。LEDが点滅します。この通信の間に、1秒の遅延が発生しています。通信の遅延を減らすにはどうすればよいですか?

arduinoからandroidにデータを受信するための私のコードは次のとおりです。

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

    }
4

2 に答える 2

0

あなたが説明している動作は、この投稿で説明されているシリアルの問題で自動リセットされているようです:https ://stackoverflow.com/a/10921900/1440715

Arduino IDE以外のほとんどのものからシリアル通信を受信すると、Arduinoは自動的にリセットされます。これが、IDEから送信できるが、他のものからは送信できない理由です(特別な注意なしに)。

私は宇野を持っていて、リセットとグラウンドの間にコンデンサを置きます。これは、このテーマに関するいくつかの良い情報が掲載されたページです。
幸運を。 http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

于 2012-08-14T14:20:12.300 に答える
0

まだ探している人のために働くことが保証されている2つの簡単な解決策。arduinoコードの場合:-

  1. 遅延を50〜100ミリ秒に増やします。

  2. Serial.begin(9600)inの後にこれを追加しsetup()ます;

    Serial.setTimeout(50);
    

ステップ2が最も重要です。上記のコードを追加して初めて機能しました。これは、まったく同じ問題が発生したときに調べた他の多くのフォーラムではあまり言及されていません。

于 2017-06-03T04:02:25.663 に答える