Модераторы: javastic, W0LF, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тормоза при чтении с BlueTooth датчика, Как то медленно опрашивает 
:(
    Опции темы
oxygenh
Дата 5.12.2014, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.11.2011

Репутация: нет
Всего: нет



Привет всем.
Нашел на гитхабе набросок мидлета для работы с bluetooth датчиком пульса. Сделал изменения в части протокола взаимодействия. Запустилось и работает, но почему то медленно. Поясню: в документашке производителя датчика описан протокол и сказано, что датчик посылает информационную посылку раз в секунду. В информационной посылке есть текущий пульс, а также количество ударов насчитанных датчиком с момента его включения (от 0 до 255 и потом снова). Код, отвечающий за прослушку и обработку посылки с датчика вот такой: 

Код

public class HRM implements Runnable {

    private final int STATE_INITIAL=1;
    private final int STATE_DLC=2;

    private final int STATE_FIRMWARE_ID1=3;
    private final int STATE_FIRMWARE_ID2=4;
    private final int STATE_FIRMWARE_VER1=5;
    private final int STATE_FIRMWARE_VER2=6;
    private final int STATE_HARDWARE_ID1=7;
    private final int STATE_HARDWARE_ID2=8;
    private final int STATE_HARDWARE_VER1=9;
    private final int STATE_HARDWARE_VER2=10;

    private final int STATE_BATTERY=11;
    private final int STATE_HRM=12;
    private final int STATE_HRBN=13;

    private boolean connected=false;
    private boolean isActive=false;

    private int state=STATE_INITIAL;
    private int mark1=0;
    private int mark2=0;
    private int u1=0;
    private int u2=0;
    private int battery=0;
    private int hr=0;
    private int hb=0;

    private String bt;

    private StreamConnection c;
    private DataInputStream data;

    private HRMListener lh;

    public HRM(HRMListener lh) {
        this.lh=lh;
    }

    public void setHRMBtAddress(String bt) {
        this.bt=bt;
    }

    /*
    */
    private boolean readHRMData() {
        int i=-1;

        try {
            i=data.read();
        } catch (IOException e) {
            Log.loge("IOe", e);
            return false;
        }

        if (i==-1)
            return false;
        if (i==0)
            return true;

        switch (state) {
            // Looking for start MSG ID byte 0x26
            case STATE_INITIAL:
                if (i==0x26) {
                    // We got start marker, go to next state
                    state=STATE_DLC;
                } else {
                    return true;
                }
                break;

            case STATE_DLC:
                //mark1=i;
                if (i==0x37) {
                    // We got start marker, go to next state
                    state=STATE_FIRMWARE_ID1;
                } else {
                    return true;
                }

            case STATE_FIRMWARE_ID1:
                state = STATE_FIRMWARE_ID2;
                break;

            case STATE_FIRMWARE_ID2:
                state=STATE_FIRMWARE_VER1;
                break;

            case STATE_FIRMWARE_VER1:
                state=STATE_FIRMWARE_VER2;
                break;

            case STATE_FIRMWARE_VER2:
                state=STATE_HARDWARE_ID1;
                break;

            case STATE_HARDWARE_ID1:
                state=STATE_HARDWARE_ID2;
                break;

            case STATE_HARDWARE_ID2:
                state=STATE_HARDWARE_VER1;
                break;

            case STATE_HARDWARE_VER1:
                state=STATE_HARDWARE_VER2;
                break;

            case STATE_HARDWARE_VER2:
                // 0x81 ?
                u1=i;
                state=STATE_BATTERY;
                break;

            case STATE_BATTERY:
                // Battery level ?

                battery=i;
                lh.heartRateBattery(battery);

                state=STATE_HRM;
                break;

            case STATE_HRM:
                hr=i;
                lh.heartRate(hr);
                // Ok, we got what we need, wait for initial marker. We ignore anything else for now
                state=STATE_HRBN;
                break;

            case STATE_HRBN:
                hb=i;
                lh.heartRateBeatNumber(hb);
                // Ok, we got what we need, wait for initial marker. We ignore anything else for now
                state=STATE_INITIAL;
                break;
        }

        return true;
    }

    public int getHR() {
        return hr;
    }

    private boolean connect() {
        try {
            c = (StreamConnection) Connector.open(bt, Connector.READ_WRITE, true);
            data = new DataInputStream(c.openInputStream());
            connected = true;
            lh.heartRate(0);
            lh.heartRateConnected();
            return true;
        } catch (ConnectionNotFoundException e) {
            lh.heartRateError("CNFE"+e.getMessage());
        } catch (IOException e) {
            disconnect();
            lh.heartRateError("IOe"+e.getMessage());
        } catch (IllegalArgumentException e) {
            lh.heartRateError("IAE"+e.getMessage());
        } catch (SecurityException e) {
            lh.heartRateError("SE"+e.getMessage());
        }
        return false;
    }

    private void disconnect() {
        try {
            if (data!=null)
                data.close();
            if (c!=null)
                c.close();
        } catch (IOException e) {

        }
        data=null;
        c=null;
        connected = false;
        lh.heartRateDisconnected();
    }

    public void stop() {
        isActive=false;
    }

    public void run() {
        if (connect()==false) {
            lh.heartRateError("ConFail");
            lh.heartRateDisconnected();
            return;
        } else {
            lh.heartRateConnected();
        }
        isActive=true;
        
        while (isActive) {
        
            boolean r=readHRMData();
            if (r==false) {
                lh.heartRateError("RF");
                // return;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                //
            }
        }
        disconnect();
    }
}



Как видно нить читает данные из потока, обрабатывает их и засыпает на 0.1 секунду.  А на деле получается такое ощущение, что каждую посылку отправленную с датчика он обрабатывает 6 секунд. Из за чего могут быть тормоза? 

Это сообщение отредактировал(а) oxygenh - 5.12.2014, 16:48
PM MAIL   Вверх
Google
  Дата 21.11.2017, 20:11 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1244 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.