ACK-Serial Port

student1234

Mitglied
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

Bekanntes Mitglied
Es gibt einige Dinge, die du in Betracht ziehen könntest, um das Problem zu lösen:
  1. 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.
  2. 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.
  3. Ü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.
  4. 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

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

  1. 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.
  2. 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.
  3. Ü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.
  4. 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:

Java:
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");
      }
    }
  }
});
 

Neue Themen


Oben