2014-07-23 10 views
0

원격 제어를하고 있습니다. 서보 + esc가있는 차가 있고 arduino에 연결되어 있으며 wifi 방패에 연결되어 있습니다. 반대편에는 안드로이드 타블렛이 있는데, 자동차를 제어하기 위해 데이터를 arduino에 보냅니다. 안드로이드 앱의 소스 코드가있다 :Android Listener interrupts 리스너

package rccardriver.app; 

import android.widget.Button; 
import android.widget.SeekBar; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.io.IOException; 
import android.os.AsyncTask; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import java.io.DataOutputStream; 



public class MainActivity extends Activity { 

    private Socket socket=null; 
    private SeekBar steeringControl = null; 
    private SeekBar speedControl = null; 
    private Button btn=null; 
    DataOutputStream DOS = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn=(Button)findViewById(R.id.button); 
     btn.setOnClickListener(buttonConnectOnClickListener); 
     steeringControl =(SeekBar)findViewById(R.id.steering_bar); 
     speedControl =(SeekBar)findViewById(R.id.speed_bar); 
     steeringControl.setMax(75); 
     speedControl.setMax(180); 
     speedControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       try { 
        DOS.write(0x01); 
        DOS.write((byte)(speedControl.getProgress()+3)); 
       } catch (IOException e) { 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       speedControl.setProgress(84); 
      } 
     }); 
     steeringControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       try { 
        DOS.write(0x00); 
        DOS.write((byte)(steeringControl.getProgress()+3)); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
     //    e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
       steeringControl.setProgress(35); 
      } 
     }); 

     MyClientTask myClientTask = new MyClientTask("192.168.12.101", 8899); 
     myClientTask.execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    View.OnClickListener buttonConnectOnClickListener = 
      new View.OnClickListener(){ 

       @Override 
       public void onClick(View arg0) { 
        try { 
         DOS.write(0x02); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
      //    e.printStackTrace(); 
        } 
       }}; 

    public class MyClientTask extends AsyncTask<Void, Void, Void> { 

     String dstAddress; 
     int dstPort; 
     MyClientTask(String addr, int port){ 
      dstAddress = addr; 
      dstPort = port; 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      try { 
       socket = new Socket(dstAddress, dstPort); 
       DOS = new DataOutputStream(socket.getOutputStream()); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
    //    e.printStackTrace(); 
    //   response = "UnknownHostException: " + e.toString(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
    //   e.printStackTrace(); 
    //   response = "IOException: " + e.toString(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
    //  textResponse.setText(response); 
      super.onPostExecute(result); 
     } 

    } 
} 

앱은 두 seekbars 1 개 버튼이는. Seekbars는 조정 및 속도를 제어합니다. 버튼은 중단을 제어합니다. 이 모든 객체에는 자체 리스너가 있습니다. 그리고이 객체 중 하나를 건 드리면 리스너가 호출되어 2 바이트를 보냅니다. 첫 번째 바이트는 nr 명령을 나타내고 두 번째 바이트는 value를 나타냅니다. 문제는 내가 심각하게 객체를 만지고, 최근에 호출 된 리스너가 다음에 호출 된 리스너에 의해 중단 된 경우입니다. 그래서 arduino는 임의의 바이트를받습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까? 청취자를 완전히 완료시키는 방법은 무엇입니까?

+0

DOS.write를 동기화 된 방법으로 배치하십시오. – kujeensiti

+0

"동기화"붙여 넣어야 할 곳을 알려주십시오. 나는 얻을 수 없다. – Qeeet

답변

0

한 걸음 물러나셔서 사과드립니다. 다음과 같이 진행할 수 있습니다.

먼저 콜백 기능이 실제로 중단되었는지 확인하십시오. DOS에 기록 된 데이터를 캡처하여 확인하십시오. socket.getOutputStream 대신 FileOutputStream으로 DOS를 생성하면됩니다. 이제 모든 DOS 쓰기 호출은 데이터를 파일에 씁니다.

앱 실행 - 빠른 UI 활동을 수행하고 파일을 가져 와서 쓰기가 실제로 무작위 순서인지 확인합니다. 확인 문제를 단순화하기 위해 실제 슬라이더 진행률 값 대신 고정 된 알려진 슬라이더 진행률 값을 씁니다. 그러면 명령과 가치를 쉽게 식별 할 수 있습니다.

결과를 게시하십시오. 그래도 문제가 지속되면 ( :)하지 말고 DOS 쓰기 호출을 동기화합니다.