Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
vertraut2009
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 8
#1

Получение и разбор данных по Bluetooth - Android

14.01.2016, 15:15. Просмотров 562. Ответов 4
Метки нет (Все метки)

Всем привет. Очень нужна помощь, не могу найти решение. Задача такова, что с ардуино посылаются показания с датчиков и различные установки.
Для того, чтобы научиться принимать команды использую простой код на ардуино:
Java
1
2
3
4
5
6
7
8
9
10
void loop() {
  for (int i=0; i<100; i++){
    Serial.print("temp=");
    Serial.println(i);
    
    Serial.print("temp2=");
    Serial.println(i*2);
    
    delay(100);
    }
В качестве разделителя использую "=". На телефоне по нему разделяю строку, левая часть получается команда, правая - значение.

Вот код который отвечает за разбор команд:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 h = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case RECIEVE_MESSAGE:                                                   // если приняли сообщение в Handler
                        byte[] readBuf = (byte[]) msg.obj;
                        String strIncom = new String(readBuf, 0, msg.arg1);
                        sb.append(strIncom);                                                // формируем строку
                        int endOfLineIndex = sb.indexOf("\r\n");                            // определяем символы конца строки
                        if (endOfLineIndex > 0) {                                            // если встречаем конец строки,
                            String sbprint = sb.substring(0, endOfLineIndex);               // то извлекаем строку
                            sb.delete(0, sb.length());                                      // и очищаем sb
                            String[] command = sbprint.split("=");
                            if(command[0].compareTo("temp")==0) {
                                txtArduino.setText("Temp: " + command[1]);             // обновляем TextView
                            }
                            if(command[0].compareTo("time")==0) {
                                time.setText("time: " + command[1]);             // обновляем TextView
                            }
                            btnOff.setEnabled(true);
                            btnOn.setEnabled(true);
                        }
                        //Log.d(TAG, "...Строка:"+ sb.toString() +  "Байт:" + msg.arg1 + "...");
                        break;
                }
            };
        };
Проблема заключается в том, что первая команда распознается и выводится, а вот вторая никак не хочет. И так при каждой итерации.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2016, 15:15     Получение и разбор данных по Bluetooth
Посмотрите здесь:

Android Передача данных через bluetooth
Получение данных с SimpleCursorAdapter Android
Получение данных из DialogFragment Android
Передача данных по Bluetooth Android
Получение данных по расписанию Android
Android Как сделать передачу данных по bluetooth
Потеря данных полученных в Android от Arduino по Bluetooth (appinvertor) Android
Android Передача данных андроид устр. - stm по bluetooth
Android Приём данных по Bluetooth
Получение данных с квадрокоптера Android
Подключение к Bluetooth модулю и получение от него информации Android
Вывод данных полученных через Bluetooth на экран Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2014 / 1756 / 546
Регистрация: 12.05.2014
Сообщений: 6,215
Завершенные тесты: 1
14.01.2016, 15:35     Получение и разбор данных по Bluetooth #2
handleMessage точно отрабатывает каждый раз?
если поставить до switch-а вывод в лог
vertraut2009
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 8
14.01.2016, 15:44  [ТС]     Получение и разбор данных по Bluetooth #3
в коде есть ошибка, я вторым if ищу не то что отправляет ардуино (отправляется temp2, а ищу time, исправил).
Мне все таки удалось менять 2 значения на телефоне путем добавления задержки в отправку команд:
Java
1
2
3
4
5
6
7
8
9
10
11
void loop() {
  for (int i=0; i<100; i++){
    Serial.print("temp=");
    Serial.println(i);
    delay(100);
    
    Serial.print("time=");
    Serial.println(i*2);
    delay(100);
    }
}
Как бы убрать эту задержку? Я так понимаю, как только телефон ловит конец строки, он забивает на всю остальную часть пришедшей информации...
_Night_Scream_
55 / 67 / 7
Регистрация: 08.08.2013
Сообщений: 545
14.01.2016, 16:30     Получение и разбор данных по Bluetooth #4
vertraut2009, покажите как принимаете данные из сокета
vertraut2009
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 8
14.01.2016, 21:32  [ТС]     Получение и разбор данных по Bluetooth #5
Если я правильно понял, то вот:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void run() {
            byte[] buffer = new byte[256];  // 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);        // Получаем кол-во байт и само собщение в байтовый массив "buffer"
                    h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Отправляем в очередь сообщений Handler
                } catch (IOException e) {
                    break;
                }
            }
        }
Добавлено через 4 часа 57 минут
Удалось добиться результата. Изменил способ отправки команд на построчно, а одной строкой. Для этого добавил еще один разделитель, который позволяет вначале разбить на отдельные команды, а потом команду на значение и название параметра.

Код ардуино:
Java
1
2
3
4
5
6
7
8
9
10
11
12
void loop() {
  for (int i=0; i<100; i++){
    Serial.print("temp=");
    Serial.print(i);
    Serial.print("|");
    Serial.print("time=");
    Serial.print(i);
    Serial.print("|");
    Serial.println();
    delay(500);
    }
}
Код приложения:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
h = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case RECIEVE_MESSAGE:                                                   // если приняли сообщение в Handler
                        byte[] readBuf = (byte[]) msg.obj;
                        String strIncom = new String(readBuf, 0, msg.arg1);
                        sb.append(strIncom);                                                // формируем строку
                        int endOfLineIndex = sb.indexOf("\r\n");                            // определяем символы конца строки
                        if (endOfLineIndex > 0) {                                            // если встречаем конец строки,
                            String sbprint = sb.substring(0, endOfLineIndex);               // то извлекаем строку
                            sb.delete(0, sb.length());                                      // и очищаем sb
                            Log.d(TAG, sbprint);
                            String[] result = sbprint.split("\\|");
                            for (int i=0; i<result.length; i++){
                                String[] command = result[i].split("=");
                            if(command[0].compareTo("temp")==0) {
                                txtArduino.setText("Temp: " + command[1]);             // обновляем TextView
                            }
                            if(command[0].compareTo("time")==0) {
                                time.setText("time: " + command[1]);             // обновляем TextView
                            }
                            }
                            btnOff.setEnabled(true);
                            btnOn.setEnabled(true);
                        }
                        //Log.d(TAG, "...Строка:"+ sb.toString() +  "Байт:" + msg.arg1 + "...");
                        break;
                }
            };
        };
Yandex
Объявления
14.01.2016, 21:32     Получение и разбор данных по Bluetooth
Ответ Создать тему
Опции темы

Текущее время: 18:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru