У меня возникает любопытная проблема. Я запрограммировал приложение, которое установит связь Bluetooth SPP с ардуином. Устройство Bluetooth на Arduino настроено на скорости 9600 бод. Я могу получить данные от arduino, но, похоже, я получаю некоторый сбой со значениями 0 или высоких пиков. Это довольно раздражает, потому что мне нужно точное значение для графической части, и я знаю, что arduino посылает хорошие данные, потому что я регистрирую, что он отправляет в файл.Bluetooth SPP (последовательный) сбой (Android)
Я ищу, чтобы исправить или понять, почему это происходит, что создание среднего или что-то подобное, что сделает «патч».
Благодарим за помощь.
Вот картинка, которая может объяснить мою проблему, Arduino диапазон данных составляет около 101 до 103:
Screenshot http://s9.postimage.org/n1td3bb4f/Screenshot_2013_03_20_22_30_15_1.png
И вот код, где я создаю соединение и получать данные:
private class ConnectedThread extends Thread {
private final DataInputStream mmInStream;
private final DataOutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = new DataInputStream(tmpIn);
mmOutStream = new DataOutputStream(tmpOut);
}
public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer); // Get number of bytes and message in "buffer"
hBluetooth.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget(); // Send to message queue Handler
} catch (IOException e) {
break;
}
}
}
private void connectDevice() {
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
}
mBluetoothAdapter.cancelDiscovery();
// Establish the connection. This will block until it connects.
Log.d(TAG, "...Connecting...");
try {
btSocket.connect();
Log.d(TAG, "....Connection ok...");
// Create a data stream so we can talk to server.
Log.d(TAG, "...Create Socket...");
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
mActionBar.setSubtitle("Connecté");
//If fail, we disconnect or display an error warning regarding the situation
} catch (IOException e) {
try {
btSocket.close();
mActionBar.setSubtitle("Deconnecté");
} catch (IOException e2) {
errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
}
}
return;
}
и, наконец, обработчик:
hBluetooth = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case RECEIVE_MESSAGE: // If we receive a message
byte[] readBuf = (byte[]) msg.obj;
String stringIncome = new String(readBuf, 0, msg.arg1); // Create string from byte array
stringBuilder.append(stringIncome);
int endOfLineIndex = stringBuilder.indexOf("\r\n"); // Determine the end-of-line
if (endOfLineIndex > 0) { // If we are at the end-of-line we parsed all the data that was sent
rmsgBluetooth = stringBuilder.substring(0, endOfLineIndex); // The string is extracted in a string object rmsgBluetooth
stringBuilder.delete(0, stringBuilder.length());
if(btSocket != null && btSocket.isConnected()){
//Here we send the value of the string to a txtbox
txtArduino.setText("Arduino: " + rmsgBluetooth);
if(rmsgBluetooth.matches("-?\\d+(\\.\\d+)?")) {
try{
sensorReading = Float.parseFloat(rmsgBluetooth);
}catch(NumberFormatException e){
}
}
Спасибо за ваш ответ! Но даже строка rmsgBluetooth имеет эту проблему ... Так что в основном проблема в другом месте. Возможно, он находится в области построителя строк, когда я пытаюсь разобрать все байты, чтобы создать строку, но я не могу найти ошибку. – Mathieu660