# Serielle Schnittstelle / COM-Port auslesen und die empfangenen Daten verarbeiten



## nderim (21. Apr 2010)

Hallo Leute,

Ich habe ein Programm, welches die ID eines RFID-Chips über USB ausliest.
Mein USB-Gerät ist am COM7-Port angeschlossen.
Ich habe eine Main-Class (JFrame - "Fenster") und noch eine weitere Klasse zur Ansteuerung des Serialports.
Das Auslesen funktioniert soweit ganz gut. Die Chips werden gelesen und die Daten kommen auch an.
In der JFrame-Class hab ich bis jetzt noch nichts besonderes drin stehen, bis auf die Erzeugung des Objekts p1 (Port_Ansteuerung)

Problem:
Mein Programm soll nach dem empfangen dieser 11-stelligen ID automatisch die ID (zum Test ob es funktioniert) in der TextArea (ta1) ausgeben.

Mein String RFID soll die ID beinhalten. Dieser String soll dann ausgegeben werden. 
Ich denke es ist ein simpler Fehler aber ich komm einfach nicht darauf.

Ich hab mir schon überlegt, dass das JFrame vielleicht nicht die Main-class sein sollte sondern eine neue Klasse erstellt werden sollte. Dann eine Beziehung zwischen Klasse "Port_Ansteuerung" und "Fenster" herstellen.

Könnte es so funktionieren?

bzw.: Habt ihr andere Vorschläge?

Gruß nderim

P.S.: Quellcode

JFrame-Klasse "Fenster"


```
public class Fenster extends javax.swing.JFrame {

    Port_Ansteuerung p1 = new Port_Ansteuerung("COM7");
    
    public Fenster() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        lb1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        ta1 = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        lb1.setText("Testfenster");

        ta1.setColumns(20);
        ta1.setRows(5);
        jScrollPane1.setViewportView(ta1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(26, 26, 26)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 372, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(231, 231, 231)
                        .addComponent(lb1)))
                .addContainerGap(76, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addComponent(lb1)
                .addGap(85, 85, 85)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 236, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(124, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Fenster().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lb1;
    private javax.swing.JTextArea ta1;
    // End of variables declaration
}
```




Klasse Port_Ansteuerung

```
import gnu.io.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;


public class Port_Ansteuerung {


	CommPortIdentifier serialPortId;
	Enumeration enumComm;
	SerialPort serialPort;
	InputStream inputStream;
	Boolean serialPortGeoeffnet = false;

	int baudrate = 9600;
	int dataBits = SerialPort.DATABITS_8;
	int stopBits = SerialPort.STOPBITS_1;
	int parity = SerialPort.PARITY_NONE;

        String RFID = "";
        
	public Port_Ansteuerung(String port)
	{
            oeffneSerialPort(port);
            System.out.println("Serial-Port wurde geöffnet");
	}
	
	boolean oeffneSerialPort(String portName)
	{
		Boolean foundPort = false;
		if (serialPortGeoeffnet != false) {
			System.out.println("Serialport bereits geöffnet");
			return false;
		}
		System.out.println("Öffne Serialport");
		enumComm = CommPortIdentifier.getPortIdentifiers();
		while(enumComm.hasMoreElements()) {
			serialPortId = (CommPortIdentifier) enumComm.nextElement();
			if (portName.contentEquals(serialPortId.getName())) {
				foundPort = true;
				break;
			}
		}
		if (foundPort != true) {
			System.out.println("Serialport nicht gefunden: " + portName);
			return false;
		}
		try {
			serialPort = (SerialPort) serialPortId.open("Öffnen und Senden", 500);
		} catch (PortInUseException e) {
			System.out.println("Port belegt");
		}

		try {
			inputStream = serialPort.getInputStream();
		} catch (IOException e) {
			System.out.println("Keinen Zugriff auf InputStream");
		}
		try {
			serialPort.addEventListener(new serialPortEventListener());
		} catch (TooManyListenersException e) {
			System.out.println("TooManyListenersException für Serialport");
		}
		serialPort.notifyOnDataAvailable(true);
		try {
			serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity);
		} catch(UnsupportedCommOperationException e) {
			System.out.println("Konnte Schnittstellen-Paramter nicht setzen");
		}
		
		serialPortGeoeffnet = true;
		return true;
	}

	void schliesseSerialPort()
	{
		if ( serialPortGeoeffnet == true) {
			System.out.println("Schließe Serialport");
			serialPort.close();
			serialPortGeoeffnet = false;
		} else {
			System.out.println("Serialport bereits geschlossen");
		}
	}
	
	void serialPortDatenVerfuegbar() {
		try {
			byte[] data = new byte[150];
			int num;
			while(inputStream.read() > -1) {
				num = inputStream.read(data, 0, data.length);
				System.out.println("Empfange: "+ new String(data, 0, num));
                                RFID = RFID + new String(data, 0, num);
                        }
		} catch (IOException e) {
			System.out.println("Fehler beim Lesen empfangener Daten");
		}
	}
        
        public String getRFID(){
            return RFID;
        }
        
	class serialPortEventListener implements SerialPortEventListener {
		public void serialEvent(SerialPortEvent event) {
			System.out.println("serialPortEventlistener");
			if (SerialPortEvent.DATA_AVAILABLE > 0);{
				serialPortDatenVerfuegbar();        
                        }
		}
	}	
}
```

Die getRFID()-Methode hab ich testweise eingbaut


----------



## nderim (21. Apr 2010)

Hallo,

also ich habe noch etwas daran rumprobiert und es hat wie ich es im ersten Beitrag schon erahnt habe funktioniert.
Einfach eine "Startklasse" als Mainclass erstellen Beziehung zwischen "Port_Ansteuerung" und "Fenster" herstellen. Dann eine Methode in Klasse "Fenster" einprogrammieren: 


```
public void (String ID){
     ta1.setText(ID);
}
```

und das Problem ist gelöst.

Ich entschuldige mich für das unnötig erstellte Thema, aber vielleicht hilft es dem ein oder anderen ja doch noch.

Gruß nderim


----------

