Android Mehrer Hexwerte über outputstream senden, und empfangen (Bluetoth)

BergJava

Aktives Mitglied
Hallo, ich sende derzeit einen hex Befehl alle Sekunde über Bluetooth. Das klappte auch alles. Aber wenn ich einen zweiten sende (auch automatisiert) und möchte die Antwort des Gerätes lesen, kommt alles durcheinander.

Wie kann ich verschieden hex-befehle (hex1,hex2,hex3) über den gleichen stream senden, ohne das es durcheinander geht.
Also sende alle sekunde hex1
empfange antw1
sende hex2
empfange antw 2 usw

Danke für die Hilfe
 

dzim

Top Contributor
Was genau kommt denn durcheinander? Wenn du auch automatisiert dafür sorgst, dass auf einen Befehl eine Antwort zu folgen hat, bevor du den nächsten sendest, sehe ich das Problem nicht.
Vielleicht musst du hier einfach für eine art Queue sorgen, die den aktuellen Befehl erst dann löscht, wenn es eine Antwort dazu gibt... Aber das ist alles nur Mutmassen ohne genaueren Einblick in deinen Ablauf (der, den du hier beschriebst, ist sehr high-level).
 

BergJava

Aktives Mitglied
Hallo, ich habe eine senden.class

Java:
public void senden() {

                byte[] message = new byte[]{0x00,0x00;
                byte[] msgBuffer = (message);
               
                                  try {
                        stream_out.write(msgBuffer);
                       
                    } catch (IOException e) {
                                          }

                }
               
            }

in der auch empfangen wird
Java:
  public void empfangen() {

                byte[] buffer = new byte[1025]; // Puffer
                int laenge; // Anzahl empf. Bytes
             try{
            	  stream_in.mark(2);
                    if (stream_in.available() > 0) {

 laenge = stream_in.read(buffer);
  for (int i = 0; i < laenge; i++) {
                            msg += String.format("%x", buffer[i]);

usw....
}

Das ganze wird zeitlich gesteuert in der MainActivity
Java:
 public void senden() {
    	
    TimerTask mt = new TimerTask() {
		
		@Override
		public void run() {
			
			if(is_connected){
			senden.senden();
			empfangen();
			
			
			}
			// TODO Auto-generated method stub
			
		}
	
    
    
    
    };	
    
    
    timer1.schedule(mt, 0, 1500);

public void empfangen(){
    	
    	Runnable runnable = new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				
				if(is_connected){
				senden.empfangen();
				
				
				}
				
				handler.sendEmptyMessage(1);
                               senden2();
			}
		};
    	
		Thread mythread = new Thread(runnable);
        mythread.start();
       
    	 public void senden2() {
    	
    	
           			
    			if(is_connected){
    		
    				senden.senden2();
    			
    			
    			empfangen2();
    			}
    			// TODO Auto-generated method stub
    			
    		}


 public void empfangen2(){
        	
        	Runnable runny = new Runnable() {
    			
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				
    				if(is_connected){
    				senden.empfangen2();
    				
    				}
                handler2.sendEmptyMessage(1);
               
    			}
    		};
        	
    		Thread mythread2 = new Thread(runny);
            mythread2.start();
        
        }

    }

Ich denke. Das Problem ist, das im stream_in als noch werte stehen, vom ersten befehl?
 
Zuletzt bearbeitet:

dzim

Top Contributor
Ach, dein erster Post (danach hast du ihn anscheinen geändert) bestand nur aus:
du hat gesagt.:

Das war
ich hat gesagt.:

Ja ich denke, dein Gedanke könnte in die Richtige Richtung gehen. Das Problem ist wohl, dass du es Zeitgestuert machst, egal ob gerade noch was gemacht wird.
Ich würde vielleicht einen Mechanismus einbauen, der prüft, ob die letzte Nachricht schon durch ist. Der Timer sollte dann so lange warten (und prüfen) bis die Letzte Nachricht durch ist.
Mehr als die paar Ratschläge kann ich dir aber nicht gehen - also keinen Code, meine ich.
 

dzim

Top Contributor
setze doch einfach ein Flag (z.B. private boolean locked = false;) am Anfang der Senden-Methode auf true und dann am Ende von Empfangen auf false. Musst nur die sicherstellen, dass die Variable immer korrekt zurückgesetzt wird. Und mach dir eine #isBlocked-Methode, die du x-Mal (sonst abbruch) vor dem senden abfragst.
 

dzim

Top Contributor
Dem Timer wird doch eine Runnable übergeben - in der kannst du ja vorher einen Check machen...
Überlege vielleicht, ob es nicht sinnvoller wäre, einen (thread-safe) Stack zu nutzen, auf dem du die durchzuführenden Operationen draufstapelst (im Timer), und die vom Thread, der die Bluetooth-Operation macht, wieder abgearbeitet wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Funktionen über Public übertragen und ausführen Android & Cross-Platform Mobile Apps 14
K Null-Pointer-Exception in ListView - wird über Datenbank gefüllt Android & Cross-Platform Mobile Apps 1
M Einfache Rechenoperation über TCP Server Android & Cross-Platform Mobile Apps 15
H Android Anklickbare Region über RadioButton zentrieren Android & Cross-Platform Mobile Apps 1
B Android TCP-Verbindung zum Server über welche Prozess auslagerung nutzen? Android & Cross-Platform Mobile Apps 1
S Android Absoluter Neuling: EditText zur Laufzeit verändern bzw. über Button Android & Cross-Platform Mobile Apps 2
V Bytes (Wertebereich 0-255) über BLE empfangen,lesen und speichern Android & Cross-Platform Mobile Apps 1
L Android SQLite mit HSQLDB über Android synchronisieren Android & Cross-Platform Mobile Apps 13
Florum Android FTP Upload über Android Android & Cross-Platform Mobile Apps 15
T Musik über Bluetooth streamen Android & Cross-Platform Mobile Apps 2
R W-Lan Problem über Sockets Android & Cross-Platform Mobile Apps 1
R Android App mit ausgeschaltetem Display über Volume-Tasten steuern Android & Cross-Platform Mobile Apps 0
A Android Login über Serveranbindung Android & Cross-Platform Mobile Apps 3
B Datei downloaden über DialogBox? Android & Cross-Platform Mobile Apps 4
T Android Druckauftrag über Mobiles Internet Android & Cross-Platform Mobile Apps 2
L Android Android über Java Code connecten? Android & Cross-Platform Mobile Apps 2
N Java ME Server-Client Verbindung über Wifi Android & Cross-Platform Mobile Apps 6
D Android JMS über Android Android & Cross-Platform Mobile Apps 4
S DTMF-Töne über MIDlet senden Android & Cross-Platform Mobile Apps 3
Kidao Wie schließt man ein Midlet über Tasten? Android & Cross-Platform Mobile Apps 3
G SMS über Handy SMS Interface versenden Android & Cross-Platform Mobile Apps 5
B RFCOMM über serielle Schnittstelle RS 232 MIDLET Android & Cross-Platform Mobile Apps 1
T Installation über WAP Android & Cross-Platform Mobile Apps 3
J Bücher über Java-Spiele-Programmierung Android & Cross-Platform Mobile Apps 3
B Kann man bei Nokia-Handy's über Java die IR ansteuern? Android & Cross-Platform Mobile Apps 6

Ähnliche Java Themen


Oben