Serial Port Daten empfangen

Jochim

Mitglied
Guten Abend,

ich programmiere in laufe eines Schulprojektes ein Warenwirtschaftssystem und verwende dabei auch einen RFID-Kartenleser, den ich über einen Serial-Port anschließe.

In einem Beispielprogramm werden die Daten mit der folgenden Methode empfangen:
Java:
void serialPortDatenVerfuegbar() {
		try {
			byte[] data = new byte[150];
			int num;
			while(inputStream.available() > 0) {
				num = inputStream.read(data, 0, data.length);
				System.out.println("Empfange: "+ new String(data, 0, num));
				empfangen.append(new String(data, 0, num));
			}
		} catch (IOException e) {
			System.out.println("Fehler beim Lesen empfangener Daten");
		}
	}
In der Ausgabe in der Konsole werden lediglich nur Bruchstücke angezeigt, aber in der TextArea sind dann die vollständigen Codes zu sehen.

Nun möchte ich die Daten aber in einem Array speichern. Nun habe ich wieder das Problem, dass ich in dem Array auch nur Bruchstücke angezeigt bekomme. Hier einmal mein Code:
Java:
public void serialPortDatenVerfuegbar(){
        empfang =new String[150];
        try {
            byte[] data = new byte[150];
            int num;
            int i=0;
            while(inputStream.available() > 0) {
                num = inputStream.read(data, 0, data.length);
                empfang[i]=new String(data, 0, num);
                System.out.println("Empfang: "+empfang[i]);
                i++;
            }
        } catch (IOException e) {
            System.out.println("Fehler beim Lesen empfangener Daten");
        }
        //rs=dh.searchRFID((String)cb_database.getSelectedItem(), empfang);
        //tbl_database.setModel(DbUtils.resultSetToTableModel(rs));
    }

Freundliche Grüße

Damien Jochim
 
Oh ok, ich habe das ganze jetzt mal mit Strings nachgebildet:
Java:
public static void main (String[] args){
	
		InputStream inputStream = new ByteArrayInputStream("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789".getBytes());
		
	
       String[]  empfang =new String[150];
        try {
            byte[] data = new byte[10];
            int num;
            int i=0;
            while(inputStream.available() > 0) {
                num = inputStream.read(data, 0, data.length);
                empfang[i]=new String(data, 0, num);
                System.out.println("Empfang: "+empfang[i]);
                i++;
            }
			for(int j = 0 ; j < i ; j++){
                System.out.print(empfang[j]);
			}
			
        } catch (IOException e) {
            System.out.println("Fehler beim Lesen empfangener Daten");
        }
        //rs=dh.searchRFID((String)cb_database.getSelectedItem(), empfang);
        //tbl_database.setModel(DbUtils.resultSetToTableModel(rs));
        
		
	}
Ich lese jetzt halt nur mit einem Buffer von 10, also immer von 0-9!
Und dabei folgende Ausgabe bekommen:
Code:
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
Empfang: 0123456789
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Ich schätze dein Problem liegt evtl. an der größe vom Buffer. Somit bekommst du immer Bruchstücke wie "Hallo mein na" , "me ist AntiM", "uffin". Aber da du ja das ganze in der TextBox wieder zusammen fügst wird aus den Teilen wieder "Hallo mein name ist AntiMuffin".
 
Hier noch ein Lösungsansatz für dein Problem:
- Trenne jede Nachricht mit einem bestimmten zeichen bsp. ";"
- Benutze zum Beispiel den Scanner und keine InputStream!!!

Hier ein kleines Beispiel mit verschiedenen Nachrichten:
Java:
public static void main (String[] args){
	
		
		
		Scanner input = new Scanner("msg1;nachricht2;text3;"); //Bei dir new Scanner (inputStream);
		input.useDelimiter(";"); // ; als trennzeichen
       String[]  empfang =new String[150];
        
            
            
            int i=0;
            while(input.hasNext()) {
               
                empfang[i]= input.next();
                System.out.println("Empfang: "+empfang[i]);
                i++;
            }
			for(int j = 0 ; j < i ; j++){
                System.out.println(empfang[j]);
			}
			
       
		
	}

Nun ist immer eine Nachricht in einem String drinnen ! :bae:
P.S. Benutze eine ArrayList wenn es nicht immer 150 Elemente sind!

Gruß,
AntiMuffin
 
Zuletzt bearbeitet:
Hallo,
ich entschuldige mich, dass es die Antwort ein bisschen verzögert kommt. Ich konnte das Problem inzwischen selbst beheben. Es lag nicht an der Byte Größe, sondern an einem einfachen Fehler im Ablauf. Ich habe die Daten in der while-Schleife immer neu hinzugefügt und nicht ergänzt.

Außerdem habe ich es jetzt auch zu einer ArrayList geändert, so wie es Vorgeschlagen wurde.

Hier meine aktuelle Funktion:
Java:
public void serialPortDatenVerfuegbar(){
        try {
            byte[] data = new byte[10];
            int num;
            while(inputStream.available() > 0) {
                num = inputStream.read(data, 0, data.length);
                input+=new String(data, 0, num);
            }
            System.out.println("Empfang: "+input);
        } catch (IOException e) {
            System.out.println("Fehler beim Lesen empfangener Daten");
        }
        empfang.add(input);
        //rs=dh.searchRFID((String)cb_database.getSelectedItem(), empfang);
        //tbl_database.setModel(DbUtils.resultSetToTableModel(rs));
    }

Nun habe ich aber noch eine Frage: Ich möchte die Daten verwenden, um Produkte in meiner Datenbank zu suchen.
Kann ich, wenn ich mit dem PreparedStatement arbeite, Auch, per setString(), mehrere Daten einem Parameter zuweisen?

Gruß

Jochim
 

Zurück
Oben