我正在进行远程控制。有一辆车,它有伺服+ esc,它们连接到arduino,连接到wifi屏蔽。 另一方面,我有Android平板电脑,它发送数据到arduino控制一辆车。 Android app有一个源代码:
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有两个搜索栏和一个按钮。 Seekbars控制转向和速度。按钮控制中断。当每个这些对象都有自己的监听器时。当我触摸任何这些对象时,会调用侦听器,它会发送两个字节:第一个字节代表nr命令,第二个字节代表值。 问题是当我不断触摸对象时,最近调用的侦听器会被下一个被调用的侦听器中断。所以arduino接收随机字节。 任何人都知道如何解决这个问题? 如何让听众完全完成?
答案 0 :(得分:0)
抱歉让你退后一步。你可以按照以下方式进行。
首先确保回调函数确实被中断。通过捕获写入DOS
的数据来验证这一点。您可以通过使用FileOutputStream
而不是socket.getOutputStream
构建DOS来实现此目的。现在,所有DOS
次写入调用都会将数据写入文件。
运行你的应用程序 - 做一些快速的UI活动 - 拉动文件 - 验证写入是否真的是随机顺序。要简化验证问题,请仅写入固定的已知滑块进度值而不是实际值。这将使您的生活变得容易识别命令与值。
请发布结果。如果问题仍然存在(它不应该 :)),我们将同步DOS写入调用。