Je travaille sur le contrôle à distance. Il y a une voiture, il a servo + esc, et ils sont connectés à arduino, qui est connecté au bouclier wifi. De l'autre côté j'ai tablette Android, qui envoie des données à arduino pour contrôler une voiture. Il y a un code source pour Android app:Android Listener interrompt Listener
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);
}
}
}
App a deux seekbars et 1 bouton. Seekbars contrôle la direction et la vitesse. Les boutons de contrôle se brisent. Quand Chacun de ces objets a son propre écouteur. Et quand je touche l'un de ces objets, l'écouteur est appelé, ce qui envoie deux octets: le premier octet représente nr de commande, le second est pour la valeur. Le problème est que lorsque je touche continuellement des objets, l'écouteur récemment appelé est interrompu par l'écouteur appelé suivant. Alors que Arduino reçoit des octets aléatoires. Quelqu'un a une idée pour résoudre ce problème? Comment faire en sorte que l'auditeur soit complètement fait?
Essayez d'encapsuler DOS.write en méthode synchronisée. – kujeensiti
pourriez-vous s'il vous plaît me pointer où je dois coller "synchronisé". Je ne peux avoir – Qeeet