Wie zu Lesen ist, kontinuierliche Daten zu und zeigen Sie es
Ich bin senden von kontinuierlichen Daten von PIC (von der analog-input), um das bluetooth-Modul und dann versuche ich zu Lesen, dass Sie mit android (in HyperTerminal bekomme ich Werte von 0 bis 255). Wie könnte ich mein code zum Lesen von strings von 3 bytes und sofort zeigen Sie Sie in die TextView. Jetzt kann ich die Anzeige von Daten, aber es ist zu langsam und die Werte werden aktualisiert, nur wenn die Taste gedrückt wird. Hier ist meine MainActivity.java:
public class MainActivity extends Activity {
private static final String TAG = "bluetooth2";
Button btn1, btn2, btn3, btn4;
TextView txtArduino;
Handler h;
private static final int REQUEST_ENABLE_BT = 1;
final int RECIEVE_MESSAGE = 1; //Status for Handler
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder sb = new StringBuilder();
private ConnectedThread mConnectedThread;
//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:09:25:92:57";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn1); //activity no. 1
btn2 = (Button) findViewById(R.id.btn2); //activity no. 2
btn3 = (Button) findViewById(R.id.btn3); //activity no. 3
btn4 = (Button) findViewById(R.id.btn4); //activity no. 4
txtArduino = (TextView) findViewById(R.id.txtArduino); //for display the received data from the Arduino
h = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case RECIEVE_MESSAGE:
byte[] readBuf = (byte[]) msg.obj;
String strIncom = new String(readBuf, 0, msg.arg1); //create string from bytes array
//Toast.makeText(MainActivity.this, strIncom, Toast.LENGTH_SHORT).show();
sb.append(strIncom); //append string
int endOfLineIndex = sb.indexOf("\r\n"); //determine the end-of-line
if (endOfLineIndex > 0) { //if end-of-line,
String sbprint = sb.substring(0, endOfLineIndex); //extract string
sb.delete(0, sb.length()); //and clear
txtArduino.setText("Data from PIC: " + sbprint); //update TextView
//btn2.setEnabled(true);
//btn1.setEnabled(true);
}
//Log.d(TAG, "...String:"+ sb.toString() + "Byte:" + msg.arg1 + "...");
break;
}
};
};
btAdapter = BluetoothAdapter.getDefaultAdapter(); //get Bluetooth adapter
checkBTState();
btn1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//btn1.setEnabled(false);
mConnectedThread.write("0"); //Send "0" via Bluetooth
//Toast.makeText(getBaseContext(), "Turn on LED", Toast.LENGTH_SHORT).show();
if(v.getId() == R.id.btn1){
//define a new Intent for the second Activity
Intent intent = new Intent(MainActivity.this,NewClass1.class);
//start the second Activity
MainActivity.this.startActivity(intent);
}}
});
btn2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//btn2.setEnabled(false);
mConnectedThread.write("1"); //Send "1" via Bluetooth
if(v.getId() == R.id.btn2){
//define a new Intent for the second Activity
Intent intent = new Intent(MainActivity.this,NewClass2.class);
//start the second Activity
MainActivity.this.startActivity(intent);
}}
});
btn3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//btn3.setEnabled(false);
mConnectedThread.write("2"); //Send "2" via Bluetooth
if(v.getId() == R.id.btn3){
//define a new Intent for the second Activity
Intent intent = new Intent(MainActivity.this,NewClass3.class);
//start the second Activity
MainActivity.this.startActivity(intent);
}}
});
btn4.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//btn4.setEnabled(false);
mConnectedThread.write("3"); //Send "3" via Bluetooth
if(v.getId() == R.id.btn4){
//define a new Intent for the second Activity
Intent intent = new Intent(MainActivity.this,NewClass4.class);
//start the second Activity
MainActivity.this.startActivity(intent);
}}
});
}
@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 = 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...");
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "...In onPause()...");
try {
btSocket.close();
} catch (IOException e2) {
errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
}
}
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 supported");
} else {
if (btAdapter.isEnabled()) {
Log.d(TAG, "...Bluetooth ON...");
} else {
//Prompt user to turn on Bluetooth
Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
Toast.makeText(getBaseContext(), "Connected!", Toast.LENGTH_SHORT).show();
}
}
}
private void errorExit(String title, String message){
Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
finish();
}
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
//Get the input and output streams, using temp objects because
//member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
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); //Get number of bytes and message in "buffer"
h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); //Send to message queue Handler
} catch (IOException e) {
break;
}
}
}
/* Call this from the main activity to send data to the remote device */
public void write(String message) {
Log.d(TAG, "...Data to send: " + message + "...");
byte[] msgBuffer = message.getBytes();
try {
mmOutStream.write(msgBuffer);
} catch (IOException e) {
Log.d(TAG, "...Error data send: " + e.getMessage() + "...");
}
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}
}
Und activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true" >
<TextView
android:id="@+id/txtArduino"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="" />
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/txtArduino"
android:text="@string/btn_1" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/btn1"
android:text="@string/btn_2" />
<Button
android:id="@+id/btn3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/btn2"
android:text="@string/btn_3" />
<Button
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/btn3"
android:text="@string/btn_4" />
</RelativeLayout>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich brauche zu laufen, etwas, was jeder so oft benutze ich einen handler.
Zu nennen, das in meiner Methode:
In diesem Fall bin ich aktualisiere mein Bildschirm alle 1000ms durch die Aufhebung es.
EDIT: vollständiges Codebeispiel
for ( ; ; )
mit einer pause von 1000ms in es und nenne es einfach mal.