원격 제어를하고 있습니다. 서보 + 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는 임의의 바이트를받습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까? 청취자를 완전히 완료시키는 방법은 무엇입니까?
DOS.write를 동기화 된 방법으로 배치하십시오. – kujeensiti
"동기화"붙여 넣어야 할 곳을 알려주십시오. 나는 얻을 수 없다. – Qeeet