问题描述
Arduino 正在通过 hc05 模块向 android 发送值。从 0 到 9、90、92、50、55 等的值,从 100 到 350 和从 400 到 650 的值。 Android 在文本框中读取和写入这些值(用于调试目的)。然后我用 if 语句控制 UI 动画。
90% android 正确读取这些值,但有时它会读取 7 而不是 77,例如,基本上它会砍掉第一个数字。我通过向它发送 7777 号码发现了这一点,它读为 777。 0 到 9(单个数字)之间的值始终按原样显示。 如果我使用 Thread.sleep(millis) 我会得到不同的结果,但 50millis 是最好的,但不是没有错误。我有一种感觉,代码是在线程休眠的时候发送的,这会切断第一个数字。
Bellow 我将发布我的部分 Java 代码。这是接收 inputStream 的部分,然后使用 if 语句执行操作。我添加了一个 if 语句来显示示例。我尽可能地精简了我的代码,因为它又大又乱。
@Override
public void run() {
InputStream inputStream;
try {
mBTSocket.getoutputStream().write(demandValues.getBytes());
} catch (IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
try {
inputStream = mBTSocket.getInputStream();
while (!bStop) {
byte[] buffer = new byte[256];
if (inputStream.available() > 0) {
inputStream.read(buffer);
int i = 0;
/*
* This is needed because new String(buffer) is taking the entire buffer i.e. 256 chars on Android 2.3.4 http://stackoverflow.com/a/8843462/1287554
*/
for (i = 0; i < buffer.length && buffer[i] != 0; i++) {
}
final String strInput = new String(buffer,i);
TextView BTtext = (TextView) findViewById(R.id.BTtext);
BTtext.setText(strInput);
runOnUiThread(new Runnable() {
@Override
public void run() {
if (BTtext.getText().toString().equals("11"))
{
overloadSwitch = (Switch) findViewById(R.id.overloadSwitch);
overloadSwitch.setChecked(false);
btntwelwe.setEnabled(false);
}
});
}
Thread.sleep(50);
}
} catch (IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
} catch (InterruptedException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
最好的事情是,如果我能识别出起始字符和结束字符。 然后我会编程 arduino 以发送 例如, 停止然后下一个
我是 Java 新手,我的项目结合了来自互联网的示例代码并将它们组合在一起,但我被困在这里。
谢谢
解决方法
解决了!
我不懂java,但我懂逻辑。 我改了:
if (inputStream.available() > 0)
到:
如果 (inputStream.available() > 2)
现在它只读取输入流至少为 3 个字节。
然后我更改了我的命令值,因此它们都是 3 个字节。 我加了 9。所以例如 1 现在是 991 而 12 现在是 912 ... 有些人嘲笑我的解决方案,但它就像一个魅力,不需要额外的代码。