2017-01-10 5 views
1

私はpcのjavaでArdiuno Unoを通して小型DCモータを制御しようとしています。このJavaアプリケーションはサーバーアプリケーションで、ソケットを使用してAndroidアプリと接続します。そして、それはちょうどjavaからの単一のコマンドに取り組んでいます。しかし、継続的に押された仕事ではない。私はボタンを押し続けるとモーターを回転させて押し続けます。私を助けてください。申し訳ありませんが、私の悪い英語。javaで連続してトリガイベントを使用してardiunoで直流モータを制御する

ここにアンドロイドコードがあります。 /継続的に押す/

class RepetitiveUpdater implements Runnable { 

     @Override 
     public void run() { 
      if (autoIncrement) { 
       increment(); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       repeatUpdateHandler.postDelayed(new RepetitiveUpdater(), REPEAT_DELAY); 
      } else if (autoDecrement) { 
       decrement(); 
       repeatUpdateHandler.postDelayed(new RepetitiveUpdater(), REPEAT_DELAY); 
      } 
     } 

    } 

    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      increment(); 
     } 
    }); 

    btn.setOnLongClickListener(new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View v) { 
      autoIncrement = true; 
      repeatUpdateHandler.post(new RepetitiveUpdater()); 
      return false; 
     } 
    }); 

    btn1.setOnLongClickListener(new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View v) { 
      autoDecrement = true; 
      repeatUpdateHandler.post(new RepetitiveUpdater()); 
      return false; 
     } 
    }); 

ここではJavaサーバーです。

private void sendMsgToPort(int k) { 
    try { 
     String s = String.valueOf(k); 
     char buf2[] = s.toCharArray(); 
     serialPort.writeByte((byte) buf2[0]); 
    } catch (SerialPortException ex) { 
     System.out.println(ex); 
    } 
} 

// ........ 
     while (true) { 
      try { 

       clientSocket = serverSocket.accept(); // accept the client connection 
       inputStreamReader = new InputStreamReader(clientSocket.getInputStream()); 
       bufferedReader = new BufferedReader(inputStreamReader); // get the client message 
       message = bufferedReader.read(); 
       sendMsgToPort(message); 
       System.out.println("m=:" + message); 
       // System.out.println("Serial : "+serialPort.readString()); 
       //inputStreamReader.close(); 
       // clientSocket.close(); 
       //System.out.println(serialPort.readBytes()); 
       //Thread.sleep(100); 

      } catch (IOException ex) { 
       // status.setText("Error: " + ex); 
       System.out.println("Problem in message reading"); 
      } 
     } 

そしてここardiunoサンプルコードです:

int val = 0; 
int led = 8; 

void setup() 
{ 
    Serial.begin(9600); 
    pinMode(led, OUTPUT); 
} 

void loop() 
{ 
    delay(100); 
} 

void serialEvent() // To check if there is any data on the Serial line 
{ 
    if (Serial.available()) 
    { 
     val = Serial.parseInt(); 
     if(val == 1) //Switch on the LED, if the received value is 1. 
     { 
      digitalWrite(led, HIGH); 
     } 
    } 

} 

`

答えて

1

一つの問題は、Javaサーバプログラムである:

clientSocket = serverSocket.accept();

新しい接続を受け入れ、1つのメッセージを読み取り/処理してから、 そのクライアントソケットは範囲外になります。接続は開いたままになり、コードは新しい接続を再度待機します。

「Javaマルチスレッドサーバー」の例を検索すると、とても簡単です。受け入れた後、専用のスレッドで各接続を完全に処理するようにしてください。これにより、別の接続を待機し、同時に確立された接続で長いダイアログを処理できます。

+0

ありがとうございました。私はJimmyBを試してみる –

関連する問題