Я работаю над дистанционным управлением. Есть автомобиль, у него есть серво + эс, и они подключены к ардуину, который подключен к экрану wifi. С другой стороны у меня есть Android-планшет, который отправляет данные в arduino для управления автомобилем. Существует исходный код для приложения для Android:
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);
}
}
}
В приложении есть два поисковых барабана и 1 кнопка. Seekbars контролирует управление и скорость. Кнопка управления прерывается. Когда у каждого из этих объектов есть свой собственный слушатель. И когда я касаюсь любого из этих объектов, вызывается слушатель, который отправляет два байта: первый байт обозначает nr команды, второй – значение. Проблема в том, что когда я постоянно касаюсь объектов, недавно вызываемый слушатель прерывается следующим вызываемым слушателем. Так что arduino получает случайные байты. У кого-нибудь есть идея, как это исправить? Как сделать слушателя полностью?
Извините, что попросил вас сделать шаг назад. Вы можете действовать следующим образом.
Сначала убедитесь, что функция обратного вызова действительно прервана. Проверьте это, взяв данные, записанные в DOS
. Вы можете сделать это, построив DOS с помощью FileOutputStream
вместо socket.getOutputStream
. Теперь все ваши записи DOS
записывают данные в файл.
Запустите приложение – выполните некоторые быстрые действия пользовательского интерфейса – потяните файл – убедитесь, что записи действительно в случайном порядке. Чтобы упростить задачу проверки, напишите только фиксированные известные значения прогресса ползунка, а не фактические. Это сделает вашу жизнь легкой идентификацией команд и ценностей.
Пожалуйста, опубликуйте результат. Если проблема все еще сохраняется (она не должна :)), мы будем синхронизировать вызовы записи DOS.