2014-11-11 3 views
1

Я работаю над считывателем OBD-ii.OBD-ii Замораживание считывателя, а не в режиме реального времени

Я использую базовый Bluetooth-чат для связи с устройством OBD-ii, регулярными выражениями для захвата ответов и отображения их в текстовых представлениях.

Это где я отправить PID код, чтобы запросить данные:

public void getData(int messagenumber) { 

    final TextView TX = (TextView) findViewById(R.id.TXView2); 

    switch(messagenumber) { 

     case 1: 
      sendMessage("01 2F" + '\r'); //get Fuel % 
      TX.setText("01 2F"); 
      Log.d("Case1: ", String.valueOf(messagenumber));  
      messagenumber++; 
      Log.d("Case1: ", String.valueOf(messagenumber));  
      break; 
     case 2: 
      sendMessage("01 31" + '\r'); //get Mileage 
      TX.setText("01 31"); 
      Log.d("Case2: ", String.valueOf(messagenumber));  
      messagenumber++; 
      Log.d("Case2: ", String.valueOf(messagenumber));  
      break; 
     case 3: 
      sendMessage("01 0C" + '\r'); //get RPM 
      TX.setText("01 0C"); 
      Log.d("Case3: ", String.valueOf(messagenumber));  
      messagenumber++; 
      Log.d("Case3: ", String.valueOf(messagenumber));  
      break; 

     default: ;  
    } 
} 

Затем забрать данные здесь:

 switch (msg.what) { 
     case MESSAGE_STATE_CHANGE: 
      if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1); 
      switch (msg.arg1) { 
      case BluetoothChatService.STATE_CONNECTED: 
       setStatus(getString(R.string.title_connected_to, mConnectedDeviceName)); 
       mConversationArrayAdapter.clear(); 
       break; 
      case BluetoothChatService.STATE_CONNECTING: 
       setStatus(R.string.title_connecting); 
       break; 
      case BluetoothChatService.STATE_LISTEN: 
      case BluetoothChatService.STATE_NONE: 
       setStatus(R.string.title_not_connected); 
       break; 
      } 
      break; 
     case MESSAGE_WRITE: 
      byte[] writeBuf = (byte[]) msg.obj; 
      // construct a string from the buffer 
      String writeMessage = new String(writeBuf); 

      mConversationArrayAdapter.add("Me: " + writeMessage); 
      break; 
     case MESSAGE_READ: 
      byte[] readBuf = (byte[]) msg.obj; 
      // construct a string from the valid bytes in the buffer    
      String readMessage = new String(readBuf, 0, msg.arg1); 
      Log.d("BYTES: ", readMessage); 

      // ------- ADDED CODE FOR OBD -------- //  
      dataRecieved = readMessage; 
      RX.setText(dataRecieved); 



      if((dataRecieved != null) && (dataRecieved.matches("\\s*[0-9A-Fa-f]{2} [0-9A-Fa-f]{2}\\s*\r?\n?"))) { 

        dataRecieved = dataRecieved.trim(); 
        String[] bytes = dataRecieved.split(" "); 
        Log.d("DR 1val: ",dataRecieved + "--!"); 


        if((bytes[0] != null)&&(bytes[1] != null)) { 

         PID = Integer.parseInt(bytes[0].trim(), 16); 
         value = Integer.parseInt(bytes[1].trim(), 16); 
         } 


      if (PID == 47) { 

      /*case 47: //PID(2F): Fuel % */ 

       int fuelValue = ((value*100)/255); 

       String displayFuel = String.valueOf("PID: " + PID + "Val: " + value + "fuel: " + fuelValue + " %"); 
       Fuel.setText(displayFuel); 
       /*break; 
      default: ;*/ 
      } 

     } 
     else if((dataRecieved != null) && (dataRecieved.matches("\\s*[0-9A-Fa-f]{2} [0-9A-Fa-f]{2} [0-9A-Fa-f]{2}\\s*\r?\n?"))) { 

      dataRecieved = dataRecieved.trim(); 
      String[] bytes = dataRecieved.split(" "); 
      Log.d("DR 2vals: ",dataRecieved + "--!"); 



      if((bytes[0] != null)&&(bytes[1] != null)&&(bytes[2] != null)) { 

       PID = Integer.parseInt(bytes[0].trim(), 16); 
       //if (PID == 12){ 
       value1 = Integer.parseInt(bytes[1].trim(), 16); 
       value2 = Integer.parseInt(bytes[2].trim(), 16); 
       /*} 
       else if (PID == 49){ 
       //mileVal = Integer.parseInt(bytes[1].trim(), 16); 
       }*/ 
      } 

       //PID(0C): RPM 
      if (PID == 12) { 

        int RPM_value = ((value1*256)+value2)/4; 


        String displayRPM = String.valueOf("PID: " + PID + "A: " + value1 + " B: " + value2 + "RPM: " + RPM_value); 
        Throttle.setText(displayRPM); 

      } 
      else if (PID == 49) { 


       //PID(31): Distance Travelled (A*256)+B 

         int miles = (int) (((value1*256)+value2)*0.62137); 

         //String displayDistance = String.valueOf(miles + " miles"); 
         String displayDistance = String.valueOf("PID: " + PID + "A: " + value1 + " B: " + value2 + "Miles: " + miles); 
         Distance.setText(displayDistance); 

     } 
     } 

Затем я использую это регулярное выражение для прослушивания> который означает, что OBD завершил обработку команды, и затем он должен вернуться к началу и снова запросить коды PID.

else if((dataRecieved != null) && (dataRecieved.matches("\\s*[ .A-Za-z0-9\\?*>\r\n]*\\s*>\\s*\r*\n*"))) { 

      if(message_number == 4){ 
       message_number = 1; 
      } 
      getData(message_number++); 
     } 

При запуске приложения требуется много времени, чтобы начать давать мне какие-либо значения, однако они точны. У меня есть журнал данных, полученных от OBD. Мой журнал, однако, выходит с некоторыми вещами, которые я не понимаю. Я также замечаю, что textView, который показывает мне, что dataRecieved содержит неизвестные символы и говорит STOPPED, затем замерзает и запускается снова через некоторое время. Вот некоторые из бревна ...

D/TextLayoutCache(5146): Cache value 0x520da3b8 deleted, size = 136 
    V/BluetoothSocket.cpp(5146): readNative 
    D/TextLayoutCache(5146): Cache value 0x4dbd5e00 deleted, size = 176 
    V/BluetoothSocket.cpp(5146): readNative 
    V/BluetoothSocket.cpp(5146): readNative 
    D/TextLayoutCache(5146): Cache value 0x4dfead50 deleted, size = 240 
    D/TextLayoutCache(5146): Cache value 0x520dcb10 deleted, size = 240 
    V/BluetoothSocket.cpp(5146): readNative 
    D/BYTES:(5146): C 
    D/BYTES:(5146): 4 
    D/BYTES:(5146): 4 
    D/BYTES:(5146): 4 
+0

My [объяснить инструмент] (http://www.regexdoc.com/re/explain.pl) разбивает его для лучшего понимания. Первое [regex] (http://regexdoc.com/re/explain.pl?re=%5Cs*%5B0-9A-Fa-f%5D%7B2%7D+%5B0-9A-Fa-f%5D%7B2 % 7D% 5Cs *% 5Cr% 3F% 5Cn% 3F & .submit = Объяснение% 21 & mode = SO & .cgifields = mode), второе [regex] (http://regexdoc.com/re/explain.pl?re=%5Cs *% 5B + .A-Za-z0-9% 5C% 5C% 3F *% 3E% 5cr% 5Cn% 5D *% 5cs *% 3E% 5cs *% 5cr *% 5Cn * &. подать = Объяснение% 21 & режим = SO & .cgifields = mode) – hwnd

+0

Спасибо за это, помогли много :) – user3010383

+0

FYI, вы можете игнорировать предупреждения о кеше, которые были удалены. См. Мой ответ на [этот вопрос] (http://stackoverflow.com/questions/17449835/tag-textlayoutcache-text-cache-value-deleted/22267989). –

ответ

0

Эти сайты помогут вам начать работу с регулярными выражениями:

http://www.rexegg.com/regex-quickstart.html

http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

При попытке понять любой код перерыва он вниз на более мелкие этапы:

dataRecieved = readMessage;

Это просто установка dataRecieved равна readMessage

В \ S стендов для Пустого пространства и является 'классом символов'

0-9 является диапазоном, так A-F, а-е. Обратите внимание, что они делают его совпадающим как с нижним, так и с верхним регистром.

При взгляде на это \ s * [.A-Za-z0-9 \ уведомление о том, что есть \ что-то среднее между \ Регулярные выражения обычно имеют эту область для поисковых запросов и диапазонов.

if((dataRecieved != null) && (dataRecieved.matches("\\s*[0-9A-Fa-f]{2} [0-9A-Fa-f]{2}\\s*\r?\n?"))) { 

Эта строка задает условное «если» и имеет & & так и должно быть верно оценить, верно для всего условного, или возвращает ложь.

Существует больше, но прежде чем я продолжу:

Я рекомендую редактировать свой вопрос в этом пункте и разъяснение того, что вы понимаете, а затем задавать вопросы о конкретных частях кода. Я не слышал в вашем вопросе, в какой части кода вы сбиты с толку, поэтому трудно ответить на ваш вопрос, не объясняя все это на данный момент.

Я надеюсь, что этот ответ поможет вам начать

+0

Я использовал инструмент объяснения hwmnd и сделал еще некоторую отладку, поэтому теперь я обновляю вопрос, когда знаю, что делают выражения! :) – user3010383

+0

Не стесняйтесь отмечать мой вопрос правильно и/или повышать свои усилия. Благодаря! – jasonleonhard

Смежные вопросы