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

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

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

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

14.01.2016, 15:15. Просмотров 705. Ответов 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
Посмотрите здесь:
Подключение к Bluetooth модулю и получение от него информации Android
Android Приём данных по Bluetooth
Передача данных по Bluetooth Android
Android Передача данных через bluetooth
Android Как сделать передачу данных по bluetooth
Android Передача данных андроид устр. - stm по bluetooth
Вывод данных полученных через Bluetooth на экран Android
Потеря данных полученных в Android от Arduino по Bluetooth (appinvertor) Android
Получение данных по расписанию Android
Получение данных из cursor Android
Получение данных с SimpleCursorAdapter Android
Получение данных из DialogFragment Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 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_
75 / 74 / 8
Регистрация: 08.08.2013
Сообщений: 581
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
Ответ Создать тему
Опции темы

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