Witam Forumowiczów,
Pracuję teraz nad prostą aplikacją (Android Studio 2.2.3), która umożliwi mi odbieranie i wysyłanie ramki danych w postaci 5 bajtów. Pierwszy bajt to bajt informujący o rozpoczęciu transmisji (0xAC), natomiast 4 kolejne powinny zostać zapisane kolejno do zmiennej id_ramki i tablicy "d". Oto fragment kodu z handlera:
mHandler = new Handler(){
public void handleMessage(android.os.Message msg){
if(msg.what == MESSAGE_READ){
String readMessage = null;
try {
readMessage = new String((byte[]) msg.obj, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
byte licznik =0;
Integer[] d=new Integer[3];
Integer id_ramki;
if ((readMessage == "0xAC")&licznik == 0)
{
licznik++;
}
else if (licznik==1)
{
id_ramki = Integer.decode(readMessage.toString());
licznik++;
}
else if (licznik ==2)
{
d[0] = Integer.decode(readMessage.toString());
licznik++;
}
else if (licznik ==3)
{
d[1] = Integer.decode(readMessage.toString());
licznik++;
}
else if (licznik ==4)
{
d[2] = Integer.decode(readMessage.toString());
licznik=0;
}
Toast.makeText(getApplicationContext(),d[0],Toast.LENGTH_SHORT).show();
}
catch (IllegalArgumentException e){}
}
if(msg.what == CONNECTING_STATUS){
if(msg.arg1 == 1)
mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj));
else
mBluetoothStatus.setText("Connection Failed");
}
}
};
Przy odebraniu pierwszego bajtu sprawdzane jest, czy to bit startu transmisji, oraz czy stan licznika jest wyzerowany. Jeżeli tak, to przy kolejno odebranych bajtach powinny one być zapisane do elementów tablicy. Tutaj jeszcze fragment kodu odpowiedzialny za nasłuchiwanie:
public void run() {
byte[] buffer = new byte[5]; // 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);
if(bytes != 0) {
mmInStream.read(buffer);
}
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
break;
}
}
}
Program ten pisałem opierając się na znalezionym kodzie w internecie. O ile z wysyłaniem i odbiorem ciągu znaków nie było problemu, tutaj pojawia się problem. Próbowałem odbierać całość jako ciąg znaków, jednak maksymalnie odbieranych było 13 znaków (ja potrzebuję minimum 20), mimo że zwiększałem wielkość bufora odbiorczego, poza tym ta forma transmisji wymagała wprowadzenia opóźnienia za pomocą funkcji SystemClock.sleep(), co w moim przypadku jest niepożądane, ponieważ transmisja powinna odbywać się bez dodatkowych opóźnień.
Podczas próby wysłania dowolnej liczby z terminala, aplikacja przestaje działać i się wyłącza.
Z góry dziękuję za pomoc.
Edit: Toast w pierwszym fragmencie kodu dodałem, aby sprawdzić czy dane odbierane są poprawnie.