Formatierter Text auf LCD

Den Speed muss ich das nächste mal messen, mit 9600 ist ja nicht so schnell.

es geht nicht um die 9600 sondern wie oft die Nachrichten kommen, Ist da eine Pause dazwischen?

Gefühlt nicht, der H.Terminal läuft glatt durch, werde mal das Ganze mit einen L.Analyzer testen.

OK, und wie willst du dann eine sinnvolle Anzeige mit 2 Zeilen erreichen. Daher meine Frage: Was soll das ganze werden?

Wenn ich eine Stunde habe, um ein Problem zu lösen, dann beschäftige ich mich

  • 45 Minuten damit das Problem zu verstehen,
  • 10 min mit der Lösung.

Und in 5 Minuten setzte ich sie um.

Ich bin immer noch bei Punkt 1.

Der Controller für eine Sat.Anlage, Ausrichtung erfolgt über Gyro.
Orginal war ein MC68HC908JK1 verbaut, ist aber Software mäsig abgeraucht.
Der Chip hat nur das Display angesteuert. Die Steuerbefehle gehen über Taster
direkt and den Sat-Dom.Auf dem Display erscheien dann die Quittierten Steuerbefehle,
angewähler Satellite, Elv.etc.

Weisst Du etwas, dann red nicht um den heissen Brei rum.

Auf dem sind 16 Zeichen.
Ein Startbyte und ein Endbyte.
Du hast also 18 Zeichen, die gelsen werden je Zeile.
Das sich die Zeile in der Länge verändert hast Du nicht gesagt.
Ich rechne mit 16 Zeichen - und die passen da rein.

Ja, du hast kein delay drin. Und ich verstehe immer noch nicht, wann welche message kommt. Für mich hört sich das so an, als könnte das gar nicht so gehen.

Ich brauche kein delay.
Wozu auch?
Das H-Term da oben ist doch eindeutig.
Es kommen 2 Zeilen.
Die erste beginnt mit 0x01 16 Char und endet auf 0x0D
die zweite beginnt mit 0x02 16 Char und endet auf 0x0D
Ich lese die Zeile bis 0x0D ('\r') und gebe die dann aus.
Ich mache kein clear, sondern schreib auf die selbe Zeile.
Also kein delay. Was sowieso da nicht rein gehört. Du musst ja sicherstellen, fortlaufend von der Seriellen lesen zu können.

Ich hab den Anfang der Zeichenkette mal anders ausgelesen.
Jetzt wird verpflichtend geprüft, ob der Zeilenanfang tatsächlich da ist.

/*
   The circuit:
   LCD RS pin to digital pin 10
   LCD Enable pin to digital pin 11
   LCD D4 pin to digital pin 12
   LCD D5 pin to digital pin 13
   LCD D6 pin to digital pin 9
   LCD D7 pin to digital pin 8
   LCD R/W pin to ground
*/

#include <LiquidCrystal.h>
constexpr byte zeilen {2};
constexpr byte spalten {16};

char buffer[spalten + 1] = {'\0'};
byte idx;
byte line;

LiquidCrystal lcd(10, 11, 12, 13, 9, 8);

void setup()
{
  Serial.begin(9600);
  lcd.begin(spalten, zeilen);
  lcd.clear();
}
//
void loop()
{
  einlesen();
}


void einlesen()
{
  if (Serial.available())
  {
    char inChar = (char)Serial.read();        // Zeichen einlesen
    if (idx == 0)
    {
      if (inChar == 0x01 || inChar == 0x02)   // Zeilenanfang finden
      {
        line = inChar - 0x01;                 // Festlegung Ausgabezeile
        idx++;
      }
    }
    else if (isPrintable(inChar))             // verhindert, das Steuerzeichen in den Buffer kommen
    {
      buffer[idx - 1] = inChar;
      if (idx < spalten)
      { idx++; }
    }
    else if (inChar == '\r')                  // Ende der Zeilenübertragung
    {
      lcd.setCursor(0, line);
      lcd.print(buffer);
      memset(buffer, '\0', sizeof(buffer));
      idx = 0;
    }
  }
}

Moin,
den code hatte ich getestet, Display läuft und text ist unvollständig.
Ziffern fehlen.
Ich habe mal ein Ausschitt von Htherm mit Zeitstempel und vom L.Analyzer angehängt.





output_2023-09-18_16-55-27.log (116,5 KB)

Da kommen alle 200ms neue Daten (gesucht nach SAT1). Jetzt erkläre mal was du da darstellen willst was du auch lesen kannst? Leider fehlen die Steuerzeichen in der Ausgabe

16:49:31.978: Sat1 As
16:49:32.178: Sat1 As
16:49:32.378: Sat1 As

Nach 200ms kommt der nächste Datensatz.

Leider fehlen in der Logdatei die Steuerzeichen.

Mach mal ein Foto von dem verschobenen Text

Und versuche mal diese Version

/*
   The circuit:
   LCD RS pin to digital pin 10
   LCD Enable pin to digital pin 11
   LCD D4 pin to digital pin 12
   LCD D5 pin to digital pin 13
   LCD D6 pin to digital pin 9
   LCD D7 pin to digital pin 8
   LCD R/W pin to ground
*/

#include <LiquidCrystal.h>
constexpr byte zeilen {2};
constexpr byte spalten {16};

char buffer[spalten + 1] = {'\0'};
byte idx;
byte line;

LiquidCrystal lcd(10, 11, 12, 13, 9, 8);

void setup()
{
  Serial.begin(9600);
  lcd.begin(spalten, zeilen);
  lcd.clear();
}
//
void loop()
{
  einlesen();
}

void einlesen(){
  int avail = Serial.available();
  if (avail) {
    for (int i = 0; i < avail; i++) {           // alle verfügbaren Zeichen abarbeiten
      char inChar = (char)Serial.read();        // Zeichen einlesen
      if (idx == 0)
      {
        if (inChar == 0x01 || inChar == 0x02)   // Zeilenanfang finden
        {
          line = inChar - 0x01;                 // Festlegung Ausgabezeile
          idx++;
        }
      }
      else if (isPrintable(inChar))             // verhindert, das Steuerzeichen in den Buffer kommen
      {
        buffer[idx - 1] = inChar;
        if (idx < spalten)
        {
          idx++;
        }
      }
      else if (inChar == '\r')                  // Ende der Zeilenübertragung
      {
        lcd.setCursor(0, line);
        lcd.print(buffer);
        memset(buffer, '\0', sizeof(buffer));
        idx = 0;
      }
    }
  }
}

Das macht keinen Sinn.
Während Du liest kommen neue Zeichen.
Und auf die 200ms würde ich mich nicht verlassen.
Die Zeitangabe ist die lokale vom Rechner, auf dem der SerMon läuft.
Du weisst nicht, wieviele Datensätze tatsächlich gelesen werden.
Du weisst nicht, was ggfls. nicht zur Auswertung bzw. zur Anzeige kommt.

Doch das macht Sinn. Damit spart man beim Auswerten den ganzen Overhead der im Hintergrund der loop läuft.

Auch das macht nichts, der Buffer regelt das.

In der Logdatei sind 900 Zeilen in 4 Minuten angekommem. Das passt schon in etwa.

Das war HTerm

Das ist leider falsch.
Es läuft nix weiter im loop.
Das was da im Hintergrund läuft, wird bei 9600 auf dem serport niemals irgendwas ausbremsen...

Der Code funktioniert bis jetzt am besten, verschluckt sich noch ab und zu aber lesbar,
habe hinter ```
lcd.print(buffer);

noch ein delay(1000) eingefügt, dadurch schon erheblich stabiler.
[DSCF8072.zip|attachment](upload://fIdeq8VafVPzC0cs6yNOGgtLF9v.zip) (5,3 MB)

Ideal Anzeige.txt (100 Bytes)
pro Sekunde ein update.

wenn du delay(5000) benutzt wird es noch stabiler. Beides ist aber einfach sinnlos, solange du nicht kapierst, das die Daten viel zu schnell kommen.

Und was machst du mit den 4 Nachrichten die in der Zwischenzeit eintrudeln?

Das Bild sieht man leider nicht.

Hört doch auf damit!
Was habt ihr denn nicht verstanden?

Ich bin raus.

Habe jetzt eine Version die funzt, den delay habe ich durch ein non blocking delay,loopzähler
ersetzt, so wird nix übersehen.Eine andere Möglichkeit währe nur die daten limitieren ,
also jede 5th oder 10th Nachricht ausgeben.
SerialEvent11.ino (1,4 KB)