2015-09-06 137 views
0

我想通過我自己的android工作室應用程序使用加速計控制一輛遙控車。嘗試通過藍牙發送命令時藍牙連接失敗

我設法讓應用程序通過按鈕調用按鈕時按下按鈕。

我想加速度計做同樣的事情,說id的x值小於這個,然後調用函數。但我不能連接到藍牙第二我包括我的前功能或安迪功能發送藍牙命令內的if語句。

如果連接不成功「連接失敗,是否爲SPP藍牙?請重試」。我不斷收到這條消息

這是我有if語句的加速度計代碼的一部分。

@Override 
public void onSensorChanged(SensorEvent event) { 

    // clean current values 
    displayCleanValues(); 
    // display the current x,y,z accelerometer values 
    displayCurrentValues(); 
    // display the max x,y,z accelerometer values 
    displayMaxValues(); 

    // get the change of the x,y,z values of the accelerometer 
    deltaX =(lastX - event.values[0]); 
    deltaY = (lastY - event.values[1]); 
    deltaZ = (lastZ - event.values[2]); 

    // if the change is below 2, it is just plain noise 
    if (deltaX < 2) 
     DownArrow.setVisibility(View.VISIBLE); 
    else 
     DownArrow.setVisibility(View.INVISIBLE); 

    if ((deltaZ > vibrateThreshold) || (deltaY > vibrateThreshold) || (deltaZ > vibrateThreshold)) { 
     v.vibrate(50); 
    } 

    if (deltaX > -4) { 
     UpArrow.setVisibility(View.VISIBLE); 
     goForward(); 
    } 

    if (deltaX < -4) 
     UpArrow.setVisibility(View.INVISIBLE); 


    if (deltaX < -7) 
     DownArrow.setVisibility(View.VISIBLE); 
     goBackward(); 

    if (deltaX > -7) 
     DownArrow.setVisibility(View.INVISIBLE); 

}

這是我調用的函數,它發送藍牙命令。

private void goForward() 
{ 
    if (btSocket!=null) 
    { 
     try 
     { 
      btSocket.getOutputStream().write("F".toString().getBytes()); 
     } 
     catch (IOException e) 
     { 
      msg("Error"); 
     } 
    } 
} 

private void goBackward() 
{ 
    if (btSocket!=null) 
    { 
     try 
     { 
      btSocket.getOutputStream().write("B".toString().getBytes()); 
     } 
     catch (IOException e) 
     { 
      msg("Error"); 
     } 
    } 
} 

這是藍牙代碼

@Override 
    protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine 
    { 
     super.onPostExecute(result); 

     if (!ConnectSuccess) 
     { 
      msg("Connection Failed. Is it a SPP Bluetooth? Try again."); 
      finish(); 
     } 
     else 
     { 
      msg("Connected."); 
      isBtConnected = true; 
     } 
     progress.dismiss(); 
    } 

我做同樣的在我的按鈕視圖,它工作正常。

btnUp.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       btnUp.setBackgroundResource(R.drawable.button_arrow_green_up_select); 
       goForward(); 
       return true; 
      } 
      if (event.getAction() == MotionEvent.ACTION_UP) { 
       btnUp.setBackgroundResource(R.drawable.button_arrow_green_up); 
       Stop(); 
      } 

      return false; 
     } 
    }); 

爲什麼它一直失敗?

+0

那麼數據的通信類型是什麼?SPP或BLE? – ifeegoo

+0

我使用HC 06藍牙模塊,我相信它是一個BLE。我的按鈕模式工作得很好。只有當我嘗試在加速計的if語句內發送命令時,它纔會失敗。 – Tkal

+0

嗨,對不起,我正在使用SPP。 – Tkal

回答

0

我做了一個項目的樂趣,當任何一個晃動android手機打開led。我用arduino和HC-05爲了與LED溝通Android。我認爲問題在於你在UI線程中通過藍牙發送「F」和「8」值。所以創建其他線程來通過藍牙發送值。

我分享我的代碼的一部分,我認爲這將是使用完整。

mmOutputstream=socket.getOutputStream(); 


@Override 
public void onSensorChanged(SensorEvent event) { 
    // TODO Auto-generated method stub 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ 
     mGravity = event.values.clone(); 
     // Shake detection 
     float x = mGravity[0]; 
     float y = mGravity[1]; 
     float z = mGravity[2]; 
     int check=0; 
     mAccelLast = mAccelCurrent; 
     mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z); 
     float delta = mAccelCurrent - mAccelLast; 
     mAccel = mAccel * 0.9f + delta; 

     Log.d("TAG",data); 
    // Make this higher or lower according to how much 
      // motion you want to detect 
     if(connection){ 
      if(mAccel<-2.0f) 
      { 
       check=10; 
      } 
      if(mAccel>-2.4f){ 
       check=0; 
      } 

     new arduinosend().execute(check); 
     } 
    } 

} 

class arduinosend extends AsyncTask<Integer, Integer, String> 
{ 


    @Override 
    protected String doInBackground(Integer... params) { 
     // TODO Auto-generated method stub 
     try { 

      mmOutputstream.write(params[0]); 


     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 





}