Odbieranie danych przez bluetooth.

0

Witam!

Piszę aplikację która ma za zadanie sterować urządzeniem za pomocą bluetooth oraz odbierać dane i prezentować je na wykresie w czasie rzeczywistym. Wysyłanie i prezentowanie na wykresie mam za sobą natomiast potrzebuję pomocy z odbieraniem danych.
Dane przychodzą w takiej formie :

'<' Ch1 Ch2 seq crc '>'

Ch1,Ch2 - uint16
seq, crc, uint8

Całość ma 8 bajtów

Po odebraniu muszę Ch1, Ch2(opcjonalnie) "spakować" do inta i wyświetlić na wykresie.

Tutaj fragment klasy:

public ConnectedThread(BluetoothSocket socket) {

        mmSocket = socket;

        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        try {
            tmpIn =  mmSocket.getInputStream();
            tmpOut =  mmSocket.getOutputStream();
        } catch (IOException e) {

        }
        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }
    public void run() {

        byte [] buffer = new byte[8];

        while (true) {
            try {
                      /*

                       if(mInStream.read()=='<'){
                       mInStream.read(buffer,0,8);
                       data = ((int) buffer[1] << 8) | ((int) buffer[2] & 0xFF);
                       }


                      */

                       mmInStream.read(buffer, 0, 8);
                       data = ((int) buffer[1] << 8) | ((int) buffer[2] & 0xFF);

            }catch (IOException e) {

                Log.e(TAG, "connection lost", e);
                break;
            }
        }
    } 

Próbowałem na kilka i niestety dane były nie prawidłowe. Z góry dziękuje za pomoc :)

0

Też to przerabiam obecnie, odbieram ramki danych i wyświetlam je na wykresie. Robię to w taki sposób, może ci się przyda:

Moja ramka danych jest taka:
# - znak początkowy
YPR= - jakieś śmieci
info1 - pierwsza wartość do wyłuskania
info2 - druga wartość do wyłuskania
info3 - trzecia wartość do wyłuskania

    • znak końca ramki
      #YPR=info1,info2,info3,*\n

			while (true) { // odbieranie
				try {
					StringWriter writer = new StringWriter();
					char[] buffer = new char[70]; 
					bufferRead = new BufferedReader(new InputStreamReader(inStream, "UTF8"));

					while((n = bufferRead.read(buffer)) != -1 && n < buffer.length){  // zapsywanie danych w tablicy buffer
						
						writer.write(buffer, 0, n);

//						if(buffer[n] == '\n') // wyjście z pętli zapisywania przy otrzymaniu znaku nowej linii
//							break;
						
						if(writer.getBuffer().indexOf("\n") != -1)
							break;
						
					}

// jeżeli w buforze znajduje się znak "#", znak "*" oraz indeks znaku "*" jest wyższy od "#" pętla jest realizowana
					if(writer.toString().indexOf("#") != -1 && writer.toString().indexOf("*") != -1 && writer.toString().indexOf("*") > writer.toString().indexOf("#")){

						msg = writer.toString();
						msg = msg.substring(msg.indexOf("#"), msg.indexOf("*")); // wycięcie części bufora
	
							(...)// jakieś operacje
						
						}

					}
					
					writer.getBuffer().setLength(0); // wyzerowanie bufora
					

					
				} catch (IOException e){
					break;
				}

Generalnie dosyć długo męczyłem się żeby dane były odbierane dynamicznie, przy innych metodach obróbki bufora dostawałem dużo śmieci, a operacje na Stringach były czasochłonne i potrafiłem dostać bardzo dużo danych, których nie byłem w stanie zdążyć obrobić. Przy kodzie który pokazałem wszystko działa cacy. Polecam jak coś używanie klasy StringWriter.

1 użytkowników online, w tym zalogowanych: 0, gości: 1