我正在做一个较大的项目的一部分,该项目需要我连续显示(在智能手机上)通过智能手机与HC-05(受Arduino控制)之间的蓝牙通信接收的串行数据。
首先,我只希望程序在屏幕上显示基本的“ Hello World”。根据我所拥有的内容,文本最初会正确显示为“ Hello World”。但是,在随后发送文本时,在返回正确的字符串然后重复之前,显示将变为“ ello Worldd”,后跟“ World World”以及其他几种不正确的变体。显然,我的意图是使它不断显示正确的文本(因为在我的最终项目中,传输的字符串将不是恒定的,但是为了简单起见,我决定最好在继续前进之前使恒定的字符串起作用)。
我最基本的Arduino代码如下:
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.write("Hello World");
delay(2000);
}
我也使用Android Studio,使用Java进行编码。我并不是特别有经验,所以我的代码基于教程。我的处理程序代码如下:
mHandler = new Handler(){
public void handleMessage(android.os.Message msg){
if(msg.what == MESSAGE_READ){
String readMessage = null;
try {
readMessage = new String((byte[]) msg.obj, "UTF-8");
mReadBuffer.setText(readMessage);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
if(msg.what == CONNECTING_STATUS){
if(msg.arg1 == 1)
mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj));
else
mBluetoothStatus.setText("Connection Failed");
}
}
};
我认为代码中处理读取传入的串行数据的功能是:
public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes = 0; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
if(bytes != 0) {
SystemClock.sleep(100);
mmInStream.read(buffer);
}
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
break;
}
}
}
鉴于先前的文本似乎出现,我假设问题出在缓冲区的某个位置,但是我不确定如何解决该问题。我也困惑为什么有时主角似乎被切断。这可能只是由于我对Android Studio的简单经验不足,但是我找不到针对此特定问题的答案,因此我希望有人可以指出一个可能只是我遗漏的问题。