2014-10-29 10 views
-1

outStream.write(msgBuffer); 它只寫入第一位。如何寫8位。如果我們發送00000001表示它只寫0,但我們想寫8位全部如何實現它。如何使用outStream.write(msgBuffer)寫入8位;

public class MainActivity extends ActionBarActivity Private SwitchButton power,simulation,reset,pause,replay,diagnosis, abs,emergency;

private static final String TAG = "bluetooth1"; 
private BluetoothAdapter btAdapter = null; 
private BluetoothSocket btSocket = null; 
private OutputStream outStream = null; 

// SPP UUID service 
private static final UUID MY_UUID = UUID 
     .fromString("00001101-0000-1000-8000-00805F9B34FB"); 

// MAC-address of Bluetooth module (you must edit this line) 
private static String address = "00:12:02:28:75:34"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    power = (ToggleButton) findViewById(R.id.toggleButton1); 
    simulation = (ToggleButton) findViewById(R.id.simulation_tb); 
    reset = (ToggleButton) findViewById(R.id.reset_bt); 
    pause = (ToggleButton) findViewById(R.id.pause_bt); 
    replay = (ToggleButton) findViewById(R.id.replay_bt); 
    diagnose = (ToggleButton) findViewById(R.id.diagnose_bt); 
    abs = (ToggleButton) findViewById(R.id.abs_bt); 
    emergency = (ToggleButton) findViewById(R.id.emergency_bt); 

    btAdapter = BluetoothAdapter.getDefaultAdapter(); 
    checkBTState(); 

    power.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      if (power.isChecked()) { 
       String str = "1"; 
       int i = Integer.parseInt(str); 
       String binarystr = Integer.toBinaryString(i); 

       char[] buffer = new char[binarystr.length()]; 
       binarystr.getChars(0, binarystr.length(), buffer, 0); 

       System.out.println("char array:: " 
         + Arrays.toString(buffer)); 

       byte[] binaryFormat = getbyteFromString(buffer); 

       for (byte b : binaryFormat) { 

        sendData(Integer.toBinaryString(b & 255 | 256) 
          .substring(1)); 
       } 

       Toast.makeText(getApplicationContext(), "LED ON", 
         Toast.LENGTH_LONG).show(); 
      } else { 
       sendData("0"); 
       Toast.makeText(getApplicationContext(), "LED OFF", 
         Toast.LENGTH_LONG).show(); 
      } 

     } 
    });  
} 

@Override 
public void onBackPressed() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage(getString(R.string.const_closeApp)) 
      .setPositiveButton(getString(R.string.const_yes), 
        dialogClickListener) 
      .setNegativeButton(getString(R.string.const_no), 
        dialogClickListener).show(); 

} 

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     switch (which) { 
     case DialogInterface.BUTTON_POSITIVE: 
      // LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(new 
      // BTStateChangedBroadcastReceiver()); 
      System.exit(0); 
      finish(); 
      break; 

     case DialogInterface.BUTTON_NEGATIVE: 
      // No button clicked 
      break; 
     } 
    } 
}; 

private void checkBTState() { 
    // Check for Bluetooth support and then check to make sure it is turned 
    // on 
    // Emulator doesn't support Bluetooth and will return null 
    if (btAdapter == null) { 
     errorExit("Fatal Error", "Bluetooth not support"); 
    } else { 
     if (btAdapter.isEnabled()) { 
      Log.d(TAG, "...Bluetooth ON..."); 
     } else { 
      // Prompt user to turn on Bluetooth 
      Intent enableBtIntent = new Intent(
        BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, 1); 
     } 
    } 
} 

private BluetoothSocket createBluetoothSocket(BluetoothDevice device) 
     throws IOException { 
    if (Build.VERSION.SDK_INT >= 10) { 
     try { 
      final Method m = device.getClass().getMethod(
        "createInsecureRfcommSocketToServiceRecord", 
        new Class[] { UUID.class }); 
      return (BluetoothSocket) m.invoke(device, MY_UUID); 
     } catch (Exception e) { 
      Log.e(TAG, "Could not create Insecure RFComm Connection", e); 
     } 
    } 
    return device.createRfcommSocketToServiceRecord(MY_UUID); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

private void sendData(String message) { 
    byte[] msgBuffer = message.getBytes(); 

    Log.d(TAG, "...Send data: " + message + "..."); 

    try { 
     outStream.write(msgBuffer); 

     Log.d(TAG, "...This is the value byte: " + msgBuffer); 
    } catch (IOException e) { 
     String msg = "In onResume() and an exception occurred during write: " 
       + e.getMessage(); 
     if (address.equals("00:00:00:00:00:00")) 
      msg = msg 
        + ".\n\nUpdate your server address from 00:00:00:00:00:00 to the correct address on line 35 in the java code"; 
     msg = msg + ".\n\nCheck that the SPP UUID: " + MY_UUID.toString() 
       + " exists on server.\n\n"; 

     errorExit("Fatal Error", msg); 
    } 
} 

private void errorExit(String title, String message) { 
    Toast.makeText(getBaseContext(), title + " - " + message, 
      Toast.LENGTH_LONG).show(); 
    finish(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

public static byte[] getbyteFromString(char[] binarystr) { 
    int length = binarystr.length/8; 

    if (binarystr.length % 8 > 0) 
     length++; 

    int iterationCount = length; 

    byte[] binaryFormat = new byte[iterationCount]; 
    int iter = iterationCount - 1; 

    for (int i = binarystr.length - 1; i >= 0;) { 

     byte byt = 0x0; 
     for (int j = 0; j < 8; j++) { 

      if (i < 0) 
       break; 

      int b = binarystr[i] - 48; 
      byt = (byte) (byt + (b << j)); 
      i--; 
     } 

     binaryFormat[iter] = byt; 

     iter--; 
    } 

    return binaryFormat; 

} 

@Override 
public void onResume() { 
    super.onResume(); 

    Log.d(TAG, "...onResume - try connect..."); 

    // Set up a pointer to the remote node using it's address. 
    BluetoothDevice device = btAdapter.getRemoteDevice(address); 

    // Two things are needed to make a connection: 
    // A MAC address, which we got above. 
    // A Service ID or UUID. In this case we are using the 
    // UUID for SPP. 

    try { 
     btSocket = createBluetoothSocket(device); 
    } catch (IOException e1) { 
     errorExit("Fatal Error", "In onResume() and socket create failed: " 
       + e1.getMessage() + "."); 
    } 

    /* 
    * try { btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); } 
    * catch (IOException e) { errorExit("Fatal Error", 
    * "In onResume() and socket create failed: " + e.getMessage() + "."); } 
    */ 

    // Discovery is resource intensive. Make sure it isn't going on 
    // when you attempt to connect and pass your message. 
    btAdapter.cancelDiscovery(); 

    // Establish the connection. This will block until it connects. 
    Log.d(TAG, "...Connecting..."); 
    try { 
     btSocket.connect(); 
     Log.d(TAG, "...Connection ok..."); 
    } catch (IOException e) { 
     try { 
      btSocket.close(); 
     } catch (IOException e2) { 
      errorExit("Fatal Error", 
        "In onResume() and unable to close socket during connection failure" 
          + e2.getMessage() + "."); 
     } 
    } 

    // Create a data stream so we can talk to server. 
    Log.d(TAG, "...Create Socket..."); 

    try { 
     outStream = btSocket.getOutputStream(); 
    } catch (IOException e) { 
     errorExit(
       "Fatal Error", 
       "In onResume() and output stream creation failed:" 
         + e.getMessage() + "."); 
    } 

} 

@Override 
public void onPause() { 
    super.onPause(); 

    Log.d(TAG, "...In onPause()..."); 

    if (outStream != null) { 
     try { 
      outStream.flush(); 
     } catch (IOException e) { 
      errorExit(
        "Fatal Error", 
        "In onPause() and failed to flush output stream: " 
          + e.getMessage() + "."); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
    } 

    try { 
     btSocket.close(); 
    } catch (IOException e2) { 
     errorExit("Fatal Error", "In onPause() and failed to close socket." 
       + e2.getMessage() + "."); 
    } 
} 

}

回答

0

它看起來像你的代碼是不完整的。無論如何,我建議使用Android的DataInputStream/DataOutputStream。只需將你的流包裝到它們中。它們提供了用任意編碼將任何類型的原始數據類型寫入String的方法。您只需使用writeString(...)方法並在另一端使用讀取的String方法。這樣您就不需要轉換字符串以便將其寫入流中,而且您不需要關心如何從流中重建它。 如果你只想寫字符串可以使用BufferedWriter它允許你只寫字符串到流,你可以使用它像這樣堅持下來到「的OutputStream」

OutputStreamWriter osw = new OutputStreamWriter(outStream); 
BufferedWriter writer = new BufferedWriter(osw); 
+0

我添加了完整的代碼。在我的arduino液晶顯示器中,它只顯示'0'的第一位。所以你可以告訴我什麼,我需要做的,以顯示在LCD 00000001當我點擊和00000000當我點擊在Android設備。 – Sonia 2014-10-29 10:13:11

+0

在Android端使用DataOutputStream,你在這裏沒有問題。你還可以發佈處理通信的Arduino代碼部分嗎?也許還有一些錯誤。 – Westranger 2014-10-29 10:29:49

+0

不,我沒有使用任何Arduino代碼進行通信,我第一次使用這個Arduino。我發現LED ON和LED OFF的代碼我使用了相同的代碼,在Arduino LCD中,當我點擊ON時它正在顯示1,當我按OFF時顯示爲0.但是要求它應該顯示00000000 8位當我按下時關閉和當我按下它應該顯示00000001。 – Sonia 2014-10-29 10:43:40