kann mir mal jemand den code erklären?

moin!

kann mir mal jemand das hier erklären?
die hardwareserial ist geändert!
deswegen serial.peekn!

void ReadBUSmsg() {
  goodPacket = false;
  source = Serial1.peekn(0);
  length = Serial1.peekn(1);
  if (length >= 0x02 && length <= 0x0C) {                 
    if (Serial1.available() >= length + 2) {              
      for (int i = 0; i <= length + 1; i++) {
        inByte[i] = Serial.peekn(i);
      }
      
      checksumByte = 0;
      for (int i = 0; i <= length; i++) {
        checksumByte ^= inByte[i];
      }
      
      if (inByte[length + 1] == checksumByte) {
        
        if (source != 0x3F   && source != 0x6B) {
          Serial1.remove(length +2);
          return;
        }

        for (int i = 0; i <= length + 1; i++) {
          BUSByte[i] = Serial1.read();
        }

        goodPacket = true;
        comparePacket();
      } 
else {
        for (int i = 0; i <= length + 1; i++) {
        }
        Serial1.remove(1);
      }
    } else {                                                     
      return;
    }
  } else {
    Serial1.remove(1);
    return;
  }
}

Nein kann ich Dir nicht erklähren weil:

Ich nicht den gesamten Sketch kenne.
Ich nicht die Änderungen in der hardwareserial kenne.

Grüße Uwe

ich meine allgemein.. zb in den for schleifen.

steig da nicht durch :frowning:

Anscheinend wurde der Treiber auf die Übertragung von Datenpaketen modifiziert. Mit peekn(i) kann man auf das i-te Byte im Paket zugreifen, mit remove(i) etwas (i Bytes?) löschen, und mit read() lesen wie gewohnt.

Bei jedem Aufruf wird versucht, ein Paket zu lesen und zu prüfen. Dazu werden die Daten nach inByte kopiert, und wenn sie vollzählig sind, und die Checksum stimmt, und die Quelle (source) die richtige ist, werden die Daten nach BUSByte kopiert und goodPacket wird true.

Mit return im Fehlerfall wäre der Code viel übersichtlicher.

kann man das umbauen ohne serial.peekn um das per swserial zu nutzen?!

und was heisst... i-te byte?!

kann man das umbauen ohne serial.peekn um das per swserial zu nutzen

Man kann alles umbauen, auch das mitgelieferte HardwareSerial.

Ob man sowas machen, oder gar -ohne den Sinn zu verstehen- verwenden sollte, ist eine andere Frage.

hoer173:
kann man das umbauen ohne serial.peekn um das per swserial zu nutzen?!

und was heisst... i-te byte?!

erste, zweite,..., i-te

das i-te ist die Ordinalzahl von vom wert der Variable i.

Grüße Uwe

Auf die hinzugefügten Methoden kann man getrost verzichten, auch auf inByte.

Ich würde damit anfangen zu warten, bis die benötigte Anzahl Bytes eingetroffen ist. Also warten bis die ersten zwei Bytes für source und length eingetroffen sind, dann auf weitere length+1 Bytes warten (+1 für checksum). Dann nach BUSByte kopieren, Source und Prüfsumme testen, und fertig.

das problem was ich hab ist:

aufbau telegram:

sender
länge
empfänger
daten
checksumme (xor aus allem)

a.das telegram zu empfangen
b.nur bestimmte telegramme von einem bestimmten absender zu empfangen
c. anhand der länge den rest empfangen
d. die checksumme prüfen
e. das slles speichern und z.b. hex byte 5 auszuwerten

das alles geht mit der funktion oben gepostet wunderbar.
mich stört aber der eingriff in die hardware.serial!

grundlegend sorgt serial.peekn dafür jeden einzelnen hex zuzuordnen.

ich komm auf keine alternative die so sauber arbeitet.

ich lese 2 seriale bussystem damit aus (standheizung bus und fahrzeug bus)
und sende per i2c an ein display
und per 3. hardware.serial bedien ich ein gsm modul mit dem ich sms auswerte.

alles mit nem mega core mini...

Wenn alle Bytes nach BUSByte kopiert werden, kann Serial1.peekn(i) ersetzt werden durch BUSByte*.*

klappt nicht... dazu mussten 3 bytes vordefiniert sein ... um n start zu haben.. oder????

danke??

Klar, Du mußt 3 Zustände unterscheiden:

  • warten auf Header
  • warten auf Daten
  • fertig gelesen

Z.B. könnte length auf 0 gesetzt werden um anzuzeigen, daß auf den Header (length und source) gewartet wird. Sind diese Bytes verfügbar (available >= 2), einlesen und length setzen. Dann warten bis weitere length+1 Bytes verfügbar sind, die dann ins Array kopiert werden können.

ok anhand source length und destination hab ich den vorgegeben header... dann muss ich eigentlich nur noch mit ner for schleife abhängig von length alle bytes einholen... die dann zusammen xor und das mit der checksumme abgleichen

nur ist length ja zb 0x04 heisst danach kommt dest. 2 daten bytes und dann die checksumme.

also muss ich anhand length das byte 6 als checksumme deklarieren.. die checksumme besteht aber aus 5 bytes und das 6 ist das ergebnis..

hast du vllt n code schnipsel?

Schau doch ins Original, da steht schon alles drin, was gemacht werden muß.