# ACK-Serial Port



## student1234 (29. Nov 2022)

Hallo zusammen ich habe da eine Verbindung zu Rs232 aufegbaut und kann Daten auch empfangen. Nur sollte nach jeder EOT meldung eine ACK versendet werden damit neue Daten kommen. So hab ich den Code geschrieben. Funktioniert nicht bekomme nur eine Zeile Daten und nicht weiter. Kann mir jemand da helfen? 

   byte[] newData = new byte[comPort.bytesAvailable()];
            int numRead = comPort.readBytes(newData, newData.length);
            //Liest wie viele Byte verfügbar sind
            System.out.println("Read " + numRead + " bytes.");

            if (newData[0] == 2 && newData.length == 85 && newData[83] == 3) {
                //start der messung wird mit STX deklariert
                System.out.println("STX detected");
                // FIXME: ack
                byte [] ack = new byte[1];
                ack[0]=6;
                ByteArrayOutputStream serial = new ByteArrayOutputStream(1);
                serial.writeBytes(ack);
                System.out.println("send ACK");
                procesingData(newData);
                //testen ob es funktioniert
            }
            else if (newData[0] == 4) {
                //Ende der Nachricht wird mit EOT deklariert
                System.out.println("EOT detected");
                //Sollte nach jedem EOT eine ACK senden
                byte [] ack = new byte[1];
                ack[0]=6;
                ByteArrayOutputStream serial = new ByteArrayOutputStream(1);
                serial.writeBytes(ack);
                System.out.println("send ACK");
                // FIXME: ack
            } else {
                //ansonsten ungültige Daten
                System.out.println("invalid data");
            }
        }

        @Override
        public int getListeningEvents() {
            return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
        }
    });
}


----------



## osion (19. Dez 2022)

Es gibt einige Dinge, die du in Betracht ziehen könntest, um das Problem zu lösen:

Stelle sicher, dass du die ACK-Meldung richtig formatierst. Es sieht so aus, als ob du versuchst, ein Byte-Array mit nur einem Element zu erstellen und es dann in einen ByteArrayOutputStream zu schreiben. Es ist möglicherweise besser, das ACK direkt als Byte zu senden, anstatt es in einen ByteArrayOutputStream zu schreiben.
Stelle sicher, dass du die ACK-Meldung tatsächlich sendest. Du könntest zum Beispiel den Befehl comPort.writeBytes(ack) verwenden, um die ACK-Meldung zu senden.
Überprüfe, ob die EOT-Meldung tatsächlich empfangen wird. Du könntest zum Beispiel den Inhalt von newData ausgeben, um zu sehen, ob die EOT-Meldung tatsächlich empfangen wird.
Stelle sicher, dass die EOT-Meldung auch tatsächlich am anderen Ende der Verbindung empfangen wird. Es könnte sein, dass die Verbindung unterbrochen wurde oder dass es Probleme bei der Übertragung der Daten gibt.


----------



## osion (19. Dez 2022)

Es gibt einige Dinge, die du in Betracht ziehen könntest, um das Problem zu lösen:


Stelle sicher, dass du die ACK-Meldung richtig formatierst. Es sieht so aus, als ob du versuchst, ein Byte-Array mit nur einem Element zu erstellen und es dann in einen ByteArrayOutputStream zu schreiben. Es ist möglicherweise besser, das ACK direkt als Byte zu senden, anstatt es in einen ByteArrayOutputStream zu schreiben.
Stelle sicher, dass du die ACK-Meldung tatsächlich sendest. Du könntest zum Beispiel den Befehl comPort.writeBytes(ack) verwenden, um die ACK-Meldung zu senden.
Überprüfe, ob die EOT-Meldung tatsächlich empfangen wird. Du könntest zum Beispiel den Inhalt von newData ausgeben, um zu sehen, ob die EOT-Meldung tatsächlich empfangen wird.
Stelle sicher, dass die EOT-Meldung auch tatsächlich am anderen Ende der Verbindung empfangen wird. Es könnte sein, dass die Verbindung unterbrochen wurde oder dass es Probleme bei der Übertragung der Daten gibt.

Mögliche Lösung (generell), aber nicht getestet:


```
import java.io.ByteArrayOutputStream;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

// ...

// Verbindung zu RS232 aufbauen und Listener für Datenverfügbarkeit registrieren
comPort.addEventListener(new SerialPortEventListener() {
  @Override
  public void serialEvent(SerialPortEvent event) {
    if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
      // Es sind Daten verfügbar, also lesen wir sie ein
      byte[] newData = new byte[comPort.bytesAvailable()];
      int numRead = comPort.readBytes(newData, newData.length);
      System.out.println("Read " + numRead + " bytes.");

      // Überprüfen, ob es sich um eine gültige Nachricht handelt
      if (newData[0] == 2 && newData.length == 85 && newData[83] == 3) {
        // STX-Meldung (Start der Übertragung) wurde empfangen
        System.out.println("STX detected");
        // Prozessieren der Daten
        procesingData(newData);

        // ACK-Meldung (Bestätigung) senden
        byte[] ack = new byte[] { 6 };
        comPort.writeBytes(ack);
        System.out.println("send ACK");
      } else if (newData[0] == 4) {
        // EOT-Meldung (Ende der Übertragung) wurde empfangen
        System.out.println("EOT detected");
        // ACK-Meldung senden
        byte[] ack = new byte[] { 6 };
        comPort.writeBytes(ack);
        System.out.println("send ACK");
      } else {
        // Ungültige Daten
        System.out.println("invalid data");
      }
    }
  }
});
```


----------

