Android Bluetooth InputStream Lesen
Ich versuche zu Lesen, serielle Daten, gesendet von einem externen bluetooth-Modul auf meinem HTC Sensation, aber wenn ich Anrufe, InputStream.verfügbar() - es gibt 0 zurück, also kann ich nicht Durchlaufen die bytes empfangen und Anruf InputStream.read(byteArray).
Könnte mir jemand helfen dieses problem zu lösen?
Brauche ich, um zu überprüfen, nach verfügbaren bytes, bevor Sie zu Lesen?
Ich entschuldige mich für meine technisch ungenau post.
Hier ist mein code:
public class BluetoothTest extends Activity
{
TextView myLabel;
TextView snapText;
EditText myTextbox;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button openButton = (Button)findViewById(R.id.open);
Button closeButton = (Button)findViewById(R.id.close);
Button chkCommsButton = (Button)findViewById(R.id.chkCommsButton);
Button offButton = (Button)findViewById(R.id.offButton);
myLabel = (TextView)findViewById(R.id.mylabel);
snapText = (TextView)findViewById(R.id.snapText);
//Open Bluetooth
openButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
try
{
findBT();
openBT();
}
catch (IOException ex) { }
}
});
//Close Bluetooth
closeButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
try
{
closeBT();
}
catch (IOException ex) { }
}
});
//Check Comms - multicast all SNAP nodes and pulse their BLUE led
chkCommsButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
chkcommsButton();
} catch (Exception e) {
//TODO: handle exception
}
}
});
//Off Button - set strip to all OFF
offButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
offButton();
} catch (Exception e) {
//TODO: handle exception
}
}
});
}
void findBT()
{
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null)
{
myLabel.setText("No bluetooth adapter available");
}
if(!mBluetoothAdapter.isEnabled())
{
Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if(pairedDevices.size() > 0)
{
for(BluetoothDevice device : pairedDevices)
{
if(device.getName().equals("BTNODE25")) //Change to match RN42 - node name
{
mmDevice = device;
Log.d("ArduinoBT", "findBT found device named " + mmDevice.getName());
Log.d("ArduinoBT", "device address is " + mmDevice.getAddress());
break;
}
}
}
myLabel.setText("Bluetooth Device Found");
}
void openBT() throws IOException
{
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard SerialPortService ID
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
beginListenForData();
myLabel.setText("BT << " + mmDevice.getName() + " >> is now open ");
}
void closeBT() throws IOException
{
stopWorker = true;
mmOutputStream.close();
mmInputStream.close();
mmSocket.close();
myLabel.setText("Bluetooth Closed");
}
void beginListenForData()
{
final Handler handler = new Handler();
final byte delimiter = 10; //This is the ASCII code for a newline character
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
workerThread = new Thread(new Runnable()
{
public void run()
{
while(!Thread.currentThread().isInterrupted() && !stopWorker)
{
try
{
int bytesAvailable = mmInputStream.available();
if(bytesAvailable > 0)
{
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for(int i=0;i<bytesAvailable;i++)
{
byte b = packetBytes[i];
if(b == delimiter)
{
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final String data = new String(encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable()
{
public void run()
{
snapText.setText(data);
}
});
}
else
{
readBuffer[readBufferPosition++] = b;
}
}
}
}
catch (IOException ex)
{
stopWorker = true;
}
}
}
});
workerThread.start();
}
void offButton() throws IOException
{
mmOutputStream.write("0".getBytes());
}
void chkcommsButton() throws IOException
{
mmOutputStream.write("1".getBytes());
}
}
Nur es loswerden und blockieren in der read-Methode. Im moment bist du nur Rauchen die CPU und nebenbei die Batterie entleeren, wenn verfügbar() null ist, die meisten der Zeit, die in jeder Plattform.
Ich verstehe nicht, was du damit meinst.
Ich verstehe nicht, was du damit meinst.
InformationsquelleAutor | 2014-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
den
InputStream.read()
Methode ist blockierend, das bedeutet es wird Sie zu blockieren, Ihren code, bis einige Daten ankommen, ODER etwas, brechen Sie das Rohr (wie eine Unterbrechung der host oder schließen des Streams).Die Blockierung ist die CPU-freundlich, da der thread, auf den WAIT-Zustand (sleep), bis ein interrupt legen Sie es in den BEREIT-Zustand, so wird es sein, geplante zur Ausführung auf der CPU, so dass Sie NICHT verwenden die cpu während des Wartens auf Daten, und dies bedeutet, dass Sie ' ll verwenden weniger Akku (oder, dass Sie zu verlassen, dass die CPU-Zeit für anderen thread)!
available()
gibt die tatsächlich vorhandenen Daten, und da die Serielle Kommunikation ist wirklich langsam (115200 Baud bei 8n1 bedeutet 11520 byte/Sekunde) und die Schleife läuft mindestens ein oder zwei Größenordnung schneller, Lesen Sie eine Menge von 0, und EINE MENGE von cpu zu bitten, die null ist... das bedeutet, dass Sie eine Menge Batterie.looping auf verfügbar, ist kein problem auf dem arduino, wie Sie nur von einem thread/Prozess: Ihren code. ABER in einer multi-thread-system-looping-check für Daten (das nennt man "polling") ist IMMER eine schlechte Idee und sollte nur getan werden, wenn Sie keine andere Wahl, und fügen Sie immer einen kleinen sleep (), damit der code nicht stehlen CPU-system und anderen thread. Gute Idee ist die Verwendung von blockierenden Aufruf (einfach zu bedienen für Anfänger) oder ein Ereignis-system, wie Sie auch für die graphics-event "(nicht immer unterstützt durch die Bibliothek, die Sie verwenden, und brauchen die Synchronisierung, so ist es sehr schwierig, aber Sie don ' T spawn anderen thread in Ihrem eigenen code, aber denken Sie daran, dass die Daten aus seriellen und Grafiken und Ihre Anwendung sind WAHRSCHEINLICH in den anderen thread, und die synchronisiert werden sollen)
InformationsquelleAutor Lesto
Sind Sie mit
Ändern
InformationsquelleAutor shruti