RS232: Daten empfangen,bearbeiten,ausgeben

Status
Nicht offen für weitere Antworten.

wildbret

Aktives Mitglied
Hallo,

ich habe ein Programm geschrieben, dass Daten an einen Microcontroller sendet, die Antwort des Controllers empfängt und diese ausgibt.
Die empfangenen Daten sollen nicht nur einfach ausgegeben, sondern vorher nach bestimmten Kritierien geprüft und bei Bedarf verändert werden.

Die Daten vom Controller kommen in folgender Form:

Startflag (1Byte), Länge(1Byte), Befehl(1Byte), Daten(Länge-1 Byte), Checksumme(1 Byte), Endflag(1 Byte)
Die Länge gibt an, wie viele Byte Befehl+Daten dem Länge-Byte folgen werden.
Beispiel: 0x02 0x01 0x22 0xBA 0x03 Die Länge ist 1, d.h. das es keine Daten gibt, nur das Command.

Mit diesem Wissen muss ich die eingehenden Bytes prüfen. Ich muss das StartByte erkennen, mir Länge und Command holen und je nach Command entsprechend handeln.
Ich habe schon sehr viel versucht und auch per Such-Funktion eingiges gefunden aber keine passende Lösung.

Im Wesentlichen habe ich 2 Varianten ausprobiert und mit ihnen experimentiert.
-Variante 1: Erst alle Daten in einen ByteFeld-Buffer schreiben und den dann über eine For-Schleife durchgehen
ausgabe ist ein Textfield, ich verwende (im Moment) einen normalen InputStream.

Probleme: Die Antwort des Controllers ist nicht immer gleich lang und oft sind es mehrere Frames hintereinander.
Ausserdem sind es nicht immer nur Bytes, die der Controller sendet.
Wenn der Befehl 0x55 ist, sendet der Controller mehrere Frames mit Characters, die auch als solche ausgegeben werden sollen. Aber sie werden als Bytes ausgegeben :(
Bei allen anderen Befehlen sollen die Bytes direkt in hexadeziamler Form ausgegeben werden. Das funktioniert ja soweit.

Oft kommt es bei der Ausgabe zu Fehlern, vor allem dann wenn es sich um mehrere Frames handelt, oder wenn man viele Befehle nacheinander sendet.
Beispiel: Das soll eigentlich immer die gleiche Antwort sein, aber es werden Bytes vergessen, oder sind 0,...
Ich glaube das hat mit dem Buffer zu tun.
2 1 7 131 3
2 1 0 0 0

2 1 7 131 3
2 1 7 0 0

2 1 7 131 3
2 1 7 131 3
2 1 7 131 3
2 1 7 131 3

Code:
public class Receiver implements SerialPortEventListener{
	  public void serialEvent(SerialPortEvent event) { 
		  if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE){
		        byte[] readBuffer = new byte[256];
		        try {
		          while (in.available() > 0) {in.read(readBuffer);}        
		          
		          ausgabe.append("\n");
		          for (int i=0;i<readBuffer.length;i++) {
		        	  if(readBuffer[i]==0x02 && readBuffer[i+2]==0x55){     
//0x02 is Startbit und 0x55 ein Befehl auf den ich reagieren will. 
//Wenn ich 0x02 finde, weiss ich dass das übernächste Byte das Command ist. 		  
		        		  byte laenge = readBuffer[i+1]; 	
//ich weiss, dass nach dem Startbit die Länge kommt        		  
		        		  for (int j=0;j<(laenge-1);j++){       
//ich gebe nur die Daten aus, ohne start,länge,befehl,crc,endbit
		        			  ausgabe.append(readBuffer[i+3+j]+" ");
		        		  }        		     
		        	  }  
		        	  if(readBuffer[i]==0x02 && readBuffer[i+2]!=0x55){  
//Gibt alle Frames aus, die ein anderes Command als 0x55 haben.
		        		  byte laenge = readBuffer[i+1];
		        		  for (int j=0;j<(laenge+4);j++){
		        			  ausgabe.append(unsignedByteToInt(readBuffer[i+j])+" ");
		        		  }      	        		  
		        	  }
		          }               
		        }
		        catch (IOException e) {System.out.println("Fehler: "+e);}	        
		      }    	      
	  }
  }


Variante 2: Mit Switch-Case und dann while(Abbruchbedingung). Dummerweise funktioniert -1 als Abbruchbedingung nicht und ich weiss nicht, ob ich überhaupt auf die folgenden Bytes zugreifen kann oder nur auf das aktuelle.
Das ist aus einem Sample des javax.com Pakets.

Code:
public void serialEvent(SerialPortEvent e) {
 	// Create a StringBuffer and int to receive input data.
	StringBuffer inputBuffer = new StringBuffer();
	int newData = 0;

	// Determine type of event.
	switch (e.getEventType()) {

	    // Read data until -1 is returned. If \r is received substitute
	    // \n for correct newline handling.
	    case SerialPortEvent.DATA_AVAILABLE:
		    while (newData != -1) {
		    	try {
		    	    newData = is.read();
			    if (newData == -1) {
				break;
			    }
			    if ('\r' == (char)newData) {
			   	inputBuffer.append('\n');
			    } else {
			    	inputBuffer.append((char)newData);
			    }
		    	} catch (IOException ex) {
		    	    System.err.println(ex);
		    	    return;
		      	}
   		    }

		// Append received data to messageAreaIn.
		messageAreaIn.append(new String(inputBuffer));
		break;

	    // If break event append BREAK RECEIVED message.
	    case SerialPortEvent.BI:
		messageAreaIn.append("\n--- BREAK RECEIVED ---\n");
	}

    }


Ich wäre über Hilfe sehr sehr dankbar, ich komme alleine nicht mehr weiter.

Danke
 

wildbret

Aktives Mitglied
Ich bin mir nicht sicher, ob die Art und Weise wie ich das Problem angehe überhaupt sinnvoll oder viel zu kompliziert und langsam ist.

Ich bin auch offen für ganz neue Lösungen und verwerfe meinen bisherigen Code.
Bin selbst nicht sehr begeistert davon.
 

wildbret

Aktives Mitglied
Dem Befehl 0x55 folgen die Zeichen einer XML-Tabelle. Mein Ziel ist es diese korrekt auszulesen und in einem Texfield darzustellen.
Das ist das Beste was ich bisher hinbekommen habe, aber die Ausgabe sieht jedes mal anders aus und ist zum Teil unvollständig und falsch.

Code:
for (int i=0;i<readBuffer.length;i++) {
		        	  if(readBuffer[i]==0x02 && readBuffer[i+2]==0x55){        		  
		        		  byte laenge = readBuffer[i+1];
		        		  byte abc[] = new byte[laenge-1];
		        		  for (int j=0;j<(laenge-1);j++){
		        			  abc[j] = readBuffer[i+3+j];		        			  
		        		  }
		        		  String bca = new String(abc);
		        		  ausgabe.append(bca);
		        	  }  
		        	  if(readBuffer[i]==0x02 && readBuffer[i+2]!=0x55){
		        		  byte laenge = readBuffer[i+1];
		        		  for (int j=0;j<(laenge+4);j++){
		        			  ausgabe.append(unsignedByteToInt(readBuffer[i+j])+" ");
		        		  }      	        		  
		        	  }
		          }

So sollte das Ergebnis aussehen, tut es aber nicht und ich kann es mir nicht erklären:

<Table>
<name>NeighborTable</name>
<neighborTableSize>1</neighborTableSize>
<nextEndDeviceAddr>200480</nextEndDeviceAddr>
<nextRouterAddr>000200</nextRouterAddr>
<numChildren>0</numChildren>
<kommentar>Router MODE ist ein</kommentar>
</Table>

So KANN das Ergebnis im TextField aussehen:

<Table> <name>NeighborTa
<neighborTableSize>1<


<nextRouterAddr>0
<numChildren>0</numChildren>
<kommentar>Router MODE ist ein</
</Table>

aber auch so:

2 8 0 0 0 0 0 0 0 0 0 0
<name>NeighborTable</name>
<neighborTableSize>1</neighborTableSize>
<nextEndDeviceAddr>2
2 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<numChildren>0</numChildren> <kommentar>Router MODE ist ein</kommentar></Table>

Das Ergebnis sieht jedes Mal anders aus, mal besser mal schlechter :(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
WPS1000 Input/Output Wie aktiviere ich den Daten Transfer von der RS232 in meine Java Applikation Java Basics - Anfänger-Themen 2
B RS232 - UnsatisfiedLinkError: no rxtxSerial Java Basics - Anfänger-Themen 17
T RS232/USB-Signale in Java weiterverarbeiten Java Basics - Anfänger-Themen 2
C Ansteuerung RS232 Schnittstelle Java Basics - Anfänger-Themen 15
N Rs232 an Laptop anschliessen und ansteuern Java Basics - Anfänger-Themen 11
J RxTx/RS232 Kommunikation (TwoWay) Java Basics - Anfänger-Themen 10
R Rxtx Rs232: I Can t send to the port Java Basics - Anfänger-Themen 5
R rxtx und RS232 Java Basics - Anfänger-Themen 2
J Rs232 (ComPORT) unter Java Java Basics - Anfänger-Themen 15
A RS232 und Microcontroller - einige Fragen Java Basics - Anfänger-Themen 7
G RS232 Java Basics - Anfänger-Themen 2
M Bitmuster eines Strings über RS232 senden Java Basics - Anfänger-Themen 5
G String zur RS232 senden und mit cr abschließen! Java Basics - Anfänger-Themen 4
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
W Daten in Echtzeit übernehmen Java Basics - Anfänger-Themen 5
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
P Schiebefix - ArrayList überschreibt Daten Java Basics - Anfänger-Themen 3
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
M Tabellen- Daten laden Java Basics - Anfänger-Themen 2
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
D Sportwetten Daten Atomatisch analysieren um optimale Strategie zu erhalten Java Basics - Anfänger-Themen 6
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
T Daten von Objekten speichern Java Basics - Anfänger-Themen 7
A Minesweeper - Daten Java Basics - Anfänger-Themen 46
A Eingelesene Daten in Array(Liste) abspeichern? Java Basics - Anfänger-Themen 18
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
R Eigenes Protokoll zur Übermittlung von Daten zum Webserver? Java Basics - Anfänger-Themen 4
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
S Daten aus eigenständiger .class-Datei abrufen Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
M jTabel mit Daten Füllen Java Basics - Anfänger-Themen 5
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
S Daten lesen und speichern Java Basics - Anfänger-Themen 26
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
L Java Programm zum Auswerten von Daten Java Basics - Anfänger-Themen 11
H Passwortmanager, Sicherheit der Daten Java Basics - Anfänger-Themen 12
G Best Practice Wie große "Tabellen" effizient durchsuchen und Daten händeln? Java Basics - Anfänger-Themen 15
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
M Best Practice Daten-Import /Trabsfomration aus Textdatei Java Basics - Anfänger-Themen 12
R JTable Suchfunktion mit SQL Daten Java Basics - Anfänger-Themen 2
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
M Erste Schritte Speichern von mehreren Daten Java Basics - Anfänger-Themen 3
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
P Einlesen von Daten via BufferedReader Java Basics - Anfänger-Themen 4
P Methoden ausgelesene (CSV-) Daten in Liste einer anderen Klasse einlesen Java Basics - Anfänger-Themen 0
F Daten aus Excel-Tabelle in Java importieren Java Basics - Anfänger-Themen 15
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
F Daten auf Webserver laden - wiederholen bei Fehler Java Basics - Anfänger-Themen 0
W Best Practice problemabhängige Persistentmachung von Daten Java Basics - Anfänger-Themen 6
P Daten von Internetseite auslesen Java Basics - Anfänger-Themen 10
N Daten/Formular per POST an Firefox/Browser senden Java Basics - Anfänger-Themen 7
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
T JTable Daten aus txt datei Java Basics - Anfänger-Themen 3
T printf Daten aus der Tabelle in Excel übernehmen Java Basics - Anfänger-Themen 5
P zweidimensionales Array anlegen und mit DB-Daten füllen Java Basics - Anfänger-Themen 14
V Einlesen von Daten Java Basics - Anfänger-Themen 8
J TableView zeigt keine Daten an Java Basics - Anfänger-Themen 14
J Daten im Programm speichern Java Basics - Anfänger-Themen 14
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
O Probleme mit CSV Daten Java Basics - Anfänger-Themen 10
M Arrays: Trennung von Daten und Darstellung Java Basics - Anfänger-Themen 1
S Daten aus Array in Klasse übertragen Java Basics - Anfänger-Themen 12
M Wie sicher sind Daten im Java Programm? Java Basics - Anfänger-Themen 9
R Daten via Post an php Script senden Java Basics - Anfänger-Themen 1
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
W (XML/XSL) Daten aus Eclipse in eine Klasse Laden. Java Basics - Anfänger-Themen 1
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
D Daten von einem int in einen string Java Basics - Anfänger-Themen 5
L Daten aus Array Feld löschen Java Basics - Anfänger-Themen 2
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
fLooojava Daten im selben Netzwerk an IP Java Basics - Anfänger-Themen 1
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben