Nextion zu Serial viel zu langsam

Hallo miteinannder, ich hab da ein problem und bekomms einfach nicht gelöst, ich bin auch recht neu in sachen Arduino.
nun zu dem Problem, ich tu über canbus daten von einer BMS abgreifen die dann auf den Nextion angezeigt werden sollen, soweit funktioniert es auch, nur extrem langsam und verzögert, ist da was mit dem speicher faul oder wieso ist das so. Dazu kommen noch weitere Daten von einem Motorcontroller, dem man sagen kann, ob mehr leistung oder weniger, mehr rekuparation oder auch weniger, ist ein elektroautoprojekt. 3 Tasten für Leistungsmodi hab ich belegt, nur muß man öffter draufdrücken bis es ankommt. Das ganze hab ich auch erstmal auf 12 Zellen beschränkt bis der code läuft, dann werden 96 Zellen abgerufen, was noch mehr daten bedeutet.
Anbei der code und ein paar bilder damit sich das etwas vorstellen kann, ich nutze den Teensy 4.0

#include <FlexCAN_T4.h>
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> can1;

int incomingByte = 0;
static CAN_message_t rxmsg, txmsg;

unsigned int CELL_id, Volt, SOC, hTMP, lTMP, PACKi, iTMP, LV, CELLb, BALL, isoDC, isoWAV, CELLDIFF, avr,
  flag, tmp_id, cell_tmp, hCELL, lCELL, pCURR, POWER, health, maxCCL, maxDCL, low_tmp, high_tmp, res, tmpm, tmphs, power;

void setup() {
  Serial2.begin(115200);

  can1.begin();
  can1.setBaudRate(500000);

  txmsg.id = 0x601;
  txmsg.len = 8;
  txmsg.buf[0] = 0x23;
  txmsg.buf[1] = 0x00;
  txmsg.buf[2] = 0x20;
  txmsg.buf[3] = 0x31;
  txmsg.buf[4] = 0x00;
  txmsg.buf[5] = 0x2A;
  txmsg.buf[6] = 0x00;
  txmsg.buf[7] = 0x00;
  can1.write(txmsg);
}

void loop(void) {
  if (can1.read(rxmsg)) {
    switch (rxmsg.id) {
      case 0x36:
        CELL_id = (word(rxmsg.buf[0]));
        Volt = (word(rxmsg.buf[1], rxmsg.buf[2]));
        Volt = (Volt / 10);
        break;
      case 0x200:
        flag = (word(rxmsg.buf[0]));
        break;
      case 0x581:
        power = (word(rxmsg.buf[5], rxmsg.buf[6]));
        power = power / 32;
        power = power * 0.4;
        power = power * 1.36;
        break;
      case 0x602:
        tmphs = (rxmsg.buf[0]);
        tmpm = (rxmsg.buf[1]);
        break;
      case 0x640:
        SOC = (word(rxmsg.buf[0]));
        res = (word(rxmsg.buf[1], rxmsg.buf[2]));
        health = (word(rxmsg.buf[3]));
        hCELL = (word(rxmsg.buf[4], rxmsg.buf[5]));
        lCELL = (word(rxmsg.buf[6], rxmsg.buf[7]));
        CELLDIFF = (hCELL - lCELL);
        break;
      case 0x641:
        hTMP = (word(rxmsg.buf[0], rxmsg.buf[1]));
        lTMP = (word(rxmsg.buf[2], rxmsg.buf[3]));
        iTMP = (word(rxmsg.buf[4], rxmsg.buf[5]));
        break;
      case 0x642:
        isoDC = (word(rxmsg.buf[0], rxmsg.buf[1]));
        isoWAV = (word(rxmsg.buf[2], rxmsg.buf[3]));
        avr = (word(rxmsg.buf[4], rxmsg.buf[5]));
        break;
      case 0x643:
        maxDCL = (word(rxmsg.buf[0], rxmsg.buf[1]));
        maxCCL = (word(rxmsg.buf[2], rxmsg.buf[3]));
        pCURR = (word(rxmsg.buf[4], rxmsg.buf[5]));
        PACKi = (word(rxmsg.buf[6], rxmsg.buf[7]));
        pCURR = pCURR - 32767;
        break;
      case 0x1838F380:
        tmp_id = (word(rxmsg.buf[0], rxmsg.buf[1]));
        cell_tmp = (word(rxmsg.buf[2]));
        low_tmp = (word(rxmsg.buf[4]));
        high_tmp = (word(rxmsg.buf[5]));
        break;
    }
  }
  //cell_voltage
  switch (CELL_id) {
    case 0:
      {
        Serial2.print("x201.val=");
        break;
      }
    case 1:
      {
        Serial2.print("x202.val=");
        break;
      }
    case 2:
      {
        Serial2.print("x203.val=");
        break;
      }
    case 3:
      {
        Serial2.print("x204.val=");
        break;
      }
    case 4:
      {
        Serial2.print("x205.val=");
        break;
      }
    case 5:
      {
        Serial2.print("x206.val=");
        break;
      }
    case 6:
      {
        Serial2.print("x207.val=");
        break;
      }
    case 7:
      {
        Serial2.print("x208.val=");
        break;
      }
    case 8:
      {
        Serial2.print("x209.val=");
        break;
      }
    case 9:
      {
        Serial2.print("x210.val=");
        break;
      }
    case 10:
      {
        Serial2.print("x211.val=");
        break;
      }
    case 11:
      {
        Serial2.print("x212.val=");
        break;
      }
  }
  Serial2.print(Volt);
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);

  //temperatur
  switch (tmp_id) {
    case 0:
      {
        Serial2.print("x301.val=");
        break;
      }
    case 1:
      {
        Serial2.print("x302.val=");
        break;
      }
    case 2:
      {
        Serial2.print("x303.val=");
        break;
      }
    case 3:
      {
        Serial2.print("x304.val=");
        break;
      }
    case 4:
      {
        Serial2.print("x305.val=");
        break;
      }
    case 5:
      {
        Serial2.print("x306.val=");
        break;
      }
    case 6:
      {
        Serial2.print("x307.val=");
        break;
      }
    case 7:
      {
        Serial2.print("x308.val=");
        break;
      }
    case 8:
      {
        Serial2.print("x309.val=");
        break;
      }
    case 9:
      {
        Serial2.print("x310.val=");
        break;
      }
    case 10:
      {
        Serial2.print("x311.val=");
        break;
      }
    case 11:
      {
        Serial2.print("x312.val=");
        break;
      }
    case 12:
      {
        Serial2.print("x313.val=");
        break;
      }
  }


  Serial2.print(cell_tmp * 10);
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);

  switch (flag) {
    case 0x00:
      {
        Serial2.print("p61.aph=0");  //mil
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("p60.aph=0");  //balance
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("t60.pco=33808");  //ready grau
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("t61.pco=33808");  //charge grau
        break;
      }
    case 0x08:
      {
        Serial2.print("p61.aph=0");  //mil
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("p60.aph=0");  //balance
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("t60.pco=2016");  //ready grün
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("t61.pco=33808");  //charge grau
        break;
      }
  }
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);


  if (Serial2.available() > 0) {
    incomingByte = Serial2.read();
    if (incomingByte == '1') {
      txmsg.id = 0x601;
      txmsg.len = 8;
      txmsg.buf[0] = 0x23;
      txmsg.buf[1] = 0x00;
      txmsg.buf[2] = 0x20;
      txmsg.buf[3] = 0x31;
      txmsg.buf[4] = 0x00;
      txmsg.buf[5] = 0x2A;
      txmsg.buf[6] = 0x00;
      txmsg.buf[7] = 0x00;
      can1.write(txmsg);

    } else if (incomingByte == '2') {
      txmsg.id = 0x601;
      txmsg.len = 8;
      txmsg.buf[0] = 0x23;
      txmsg.buf[1] = 0x00;
      txmsg.buf[2] = 0x20;
      txmsg.buf[3] = 0x31;
      txmsg.buf[4] = 0x00;
      txmsg.buf[5] = 0x4A;
      txmsg.buf[6] = 0x00;
      txmsg.buf[7] = 0x00;
      can1.write(txmsg);

    } else if (incomingByte == '3') {
      txmsg.id = 0x601;
      txmsg.len = 8;
      txmsg.buf[0] = 0x23;
      txmsg.buf[1] = 0x00;
      txmsg.buf[2] = 0x20;
      txmsg.buf[3] = 0x31;
      txmsg.buf[4] = 0x00;
      txmsg.buf[5] = 0x7D;
      txmsg.buf[6] = 0x00;
      txmsg.buf[7] = 0x00;
      can1.write(txmsg);

    } else {
      txmsg.id = 0x601;
      txmsg.len = 8;
      txmsg.buf[0] = 0x40;
      txmsg.buf[1] = 0x00;
      txmsg.buf[2] = 0x20;
      txmsg.buf[3] = 0x31;
      txmsg.buf[4] = 0x00;
      txmsg.buf[5] = 0x00;
      txmsg.buf[6] = 0x00;
      txmsg.buf[7] = 0x00;
      can1.write(txmsg);
    }


    Serial2.print("x06.val=");
    Serial2.print(hTMP * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x07.val=");
    Serial2.print(lTMP * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x333.val=");
    Serial2.print(avr * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("n0.val=");
    Serial2.print(SOC);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("n1.val=");
    Serial2.print(PACKi / 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x02.val=");
    Serial2.print(hCELL / 100);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x297.val=");
    Serial2.print(hCELL / 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x03.val=");
    Serial2.print(lCELL / 100);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x298.val=");
    Serial2.print(lCELL / 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x299.val=");
    Serial2.print(CELLDIFF / 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("n2.val=");
    Serial2.print(pCURR * PACKi / 1000);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x06.val=");
    Serial2.print(hTMP * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x07.val=");
    Serial2.print(lTMP * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x04.val=");
    Serial2.print(LV);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("n60.val=");
    Serial2.print(maxDCL);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("n61.val=");
    Serial2.print(maxCCL);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("n63.val=");
    Serial2.print(health);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x701.val=");
    Serial2.print(isoDC);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x702.val=");
    Serial2.print(isoWAV);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x05.val=");
    Serial2.print(iTMP * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x401.val=");
    Serial2.print(tmphs * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("x402.val=");
    Serial2.print(tmpm * 10);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);

    Serial2.print("n502.val=");
    Serial2.print(power);
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
  }
}



Benutze das von dir verwendete Display nicht und irgendwie ist mir nicht so ganz klar wo in deinem code die Daten ans Display gesendet werden. Deshalb die Frage. Ist das wirklich dein kompletter code?
Nicht das da noch was fehlt und sich dort irgendwo noch ein delay eingeschlichen hat.
Das würde mir zu mindest die Verzögerung und das mehrmalige drücken erklären.

kannst du das genauer beschreiben? Was bedeutet "langsam" und um wie viel verzögert?
Welche Zeit ist zwischen Änderung eines Zustands und Ausgabe auf dem Display?

Was mir auffällt, du schickst relativ viele Ausgaben in jedem Loop-Durchgang an Serial2/dein Display. An deiner Stelle würde die Daten nur senden wenn sich etwas verändert hat.

Was mir auch gerade auffällt das machst du gefühlt 100x in der loop. Reicht das nicht einmal aus?

Muss das ist EON.
Habe auch keinen, nur so wie hier offt wird über Nextion geschrieben

Das muss so und ist die Endekennung eines Befehls an das Nextion - dreimal 0xff.

An der Geschwindigkeit auf der Schnittstelle kann es nicht liegen, die hast Du ja schon von den üblichen 9600 auf 115200 hochgedreht.

Ich gehe wie @noiasca auch davon aus, dass es an der Masse der Übertragungen liegt. Das Nextion muss die ganzen Aufträge ja auch abarbeiten; die Dinger sind zwar fix, aber ob sie so schnell sind wage ich zu bezweifeln.

Dazu kommt ob die Werte auch sofort da sind.

Ok hab mich jetzt mal in das Nextion reingelesen. Jetzt verstehe ich auch wie die Daten zum Display kommen. Aber da fällt mir auf, dass du sie mit einer rate von 115200 zum Display überträgst. Das can liest du aber ca. 4x schneller (500000) aus. Ich denke da könnte das Problem liegen, dass mehr Daten ankommen, als das Display in der selben Zeit verarbeiten kann.
Wäre es möglich die Datenrate vom bus an die vom Display anzupassen. Nur rein für versuchszwecke? Weil wenn dann die Verzögerung weg wäre, wüsste man zumindest woran es liegt und könnte da dann ansetzen.

hab ich gemacht, jetzt komm ich nicht mehr in die BMS und hab mich ausgeschlossen, perfekt

Oki dann spielt da das can nicht mit. Einfach wieder die 500000 einstellen. Dann könnte man es aber umgekehrt versuchen. Die Datenrate vom Display versuchsweise auf 9600 stellen. Wenn dann alles noch viel viel langsamer wird als es eh schon ist, weißt du zumindest, woran es liegt.

wird auf jedenfall langsammer, hab auch mal auf 9216000 gestellt gehabt, wird nicht merklich schneller, aber was mich vorallem wundert, warum gehen daten verloren, beispielsweise wenn ich von eco auf normal oder sport umstellen will, muß ich gefühlt 4-8 auf die taste drück bis es angenommen wird, ich denke es liegt einfach am code

Nein, solange der Sender ein Fremdgerät ist.

Alle Teilnehmer an einem CAN-Bus müssen dieselben Parameter verwenden. CAN ist eine serielle Übertragung. Du stellst ja auch deinen seriellen Monitor nicht auf 9600 wenn der Arduino mit 115200 pustet.

Kann (auf dem Taschencomputer) deinem Code aus #1 keinen Eingang entnehmen.

Touch auf dem Nextion und das schaltet die Page selbst um?
Falls ja, siehst du daran dass es ziemlich gut ausgelastet ist. Ich denke: überlastet.

Zeile 267
if (Serial2.available() > 0) {
incomingByte = Serial2.read();
if (incomingByte == '1') {
txmsg.id = 0x601;

hier geht die abfrage los

Das ist wieder eine schöne Knobelaufgabe.
Da ich keinen teensy habe und auch aktuell keine Konfig dafür bauen kann, müsstest Du mir helfen, wenn ich Dir das aus der Logik umbaue und es nicht gleich auf Anhieb funktioniert.
Wenn Du willst, dann bin ich bei.

Ah okay, danke.

Dann sehe ich zwei mögliche Bremsen:

  • Display (s.o.) - das sendet die Taste
  • loop() selbst: Du kommst zu selten an der Abfrage vorbei.

@my_xy_projekt hat da wohl eine Idee wie er das lösen kann... Nicht blockierend vermute ich.

helfen tun wir doch alle gerne

Dann las mir mal etwas Zeit, ich muss mich da erst kurz einarbeiten.
Der Ansatz wäre dann:

void loop(void)
{
  canReadIn();
  cellVoltage();
  cellTemperature();
  flagOut();
  readNextion();
}

Ich hol mir mal die lib und schau mal, ob die auch auf nem MEGA kompiliert.
Dann bekomm ich das wenigstens fehler- udn warnungsfrei hin und bin mir auch sicher, dass das die Lösung werden wird.

Das der Code überhaupt funktioniert hat....
Stichwort Funktionsblock - und das mehrfach.

    case 0x00:
      {
        Serial2.print("p61.aph=0");  //mil
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("p60.aph=0");  //balance
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("t60.pco=33808");  //ready grau
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.print("t61.pco=33808");  //charge grau
        break;
      }

Ja.

ich glaube auf dem mega läuft die biblio flexcan_t4 nicht, ist wohl nur für den Teensy 4.0, glaub ich zumindest