Formatierter Text auf LCD

Moin Allerseits,
habe das Problem einen text der seriel reinkommt (9600) auf eine 16,2 Display anzuzeigen.
String Grösse geht nicht da vareiert.Die obere Zeile zeigt den Satelliten an, die untere Elev. etc.

  1. Zeile beginnt mit SOH (Start of Heading)
  2. Zeile mit STX (Start of Text)
    bekomme die daten zwar aufs Display, aber völlig wahrlos.
    Für Hilfe,Ideen und Beispiele währe ich dankbar.

/soh/Sat1 Astr19 2106
/stx/NID 0085 EL 28
/soh/Sat1 Astr19 2106
/stx/NID 0085 EL 28
/soh/Sat1 Astr19 2109
/stx/NID 0085 EL 28
/soh/Sat1 Astr19 2109
/stx/NID 0085 EL 28
/soh/Sat1 Astr19 2108
/stx/NID 0085 EL 28

Könnten Sie Ihren Code teilen?

Doch geht.
Du weisst, wieviele Zeichen in eine Zeile passen.
Lege Dir einen Buffer an mit einem zeichen mehr.
In den buffer kannst Du Deine eingelesenen Daten einwerfen.
Dann gibst Du die auf dem Display aus.

Die Meldung besteht immer aus zwei Zeilen.
wenn die Zeile mit SOH anfängt
Zeile 1 beschreiben und bis zum Ende löschen
wenn die Zeile mit STX anfängt
Zeile 2 beschreiben und bis zum Ende löschen.

Hallo mstinka

Poste mal einen, mit einem Terminalprogamm erzeugten, Hex-Dump von der seriellen Schnittstelle.

wenn schon dan bekommt man nur :
Sat1 Astr19 2106 drauf

Code in Code Tags posten,
Bild vom Display posten damit wir sehen was du aktuell falsch läuft

Ja, das war mal die orginal Anzeige des Receivers, der Rest sin die Steuerzeichen.
Die Eingestellten Zeilen sind die Orginal Daten über die Serielle Schnittstelle.

mfg

Habe bis jetzt nur mit dem Standart Beispiel Code vom Aduino herumgespielt.

mfg

Zeige mal die Version, die dir schon was aufs Display schreibt


SeaTel_Mix.pdf (37,7 KB)

SerialEvent01.ino (1,4 KB)

/*
   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>
String inputString = "";      // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

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


  void setup()
{
inputString.reserve(36);
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0,0);
Serial.begin(9600);
}
 void loop() {

   if (stringComplete) {
    lcd.clear();
    lcd.print(inputString);// print the string when a newline arrives:
    delay(1000);
    inputString = "";      // clear the string:
    stringComplete = false;
    
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\r') {
      stringComplete = true;
    }
  }
}

Für die User die mit Tablet oder Handy unterwegs sind :wink:

Versuche es mal so:

/*
   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>
String inputString = "";      // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
int line = 0;

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

void setup() {
  inputString.reserve(36);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);
}
void loop() {
  while (Serial.available() and !stringComplete) {    
    char inChar = (char)Serial.read(); // get the new byte:
    switch (inChar) {
      case '\r':
        stringComplete = true;
        break;
      case 1:
        line = 0;
        inputString = "";  // clear the string:
        break;
      case 2:
        line = 1;
        inputString = "";  // clear the string:
        break;
      default:
        // add it to the inputString:
        inputString += inChar;
    }
  }
  if (stringComplete) {
    if (line == 0) {
      lcd.clear();
      lcd.setCursor(0, 0);
    } else {
      lcd.setCursor(1, 0);
    }
    lcd.print(inputString);  
    stringComplete = false;
  }
}

Ganz ohne String.
Ganz ohne "isComplete"

/*
   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
    /*
       das erste übertragene Zeichen gibt die Zeile an,
       in der das folgende dargestellt werden soll
       Wenn also noch nix im buffer ist, ist das erste
       Zeichen die Zeilenauswahl
    */
    if (idx == 0)
    {
      line = byte(inChar) - 1;
      idx++;
    }
    else if (isPrintable(inChar))     // verhindert, das Steuerzeichen in den Buffer kommen
    {
      buffer[idx - 1] = inChar;
      if (idx < spalten+1)
      { idx++; }
    }
    else if (inChar == '\r')      // Ende der Zeilenübertragung
    {
      lcd.setCursor(0, line);
      lcd.print(buffer);
      memset(buffer, '\0', sizeof(buffer));
      idx = 0;
    }
  }
}

Es ist kein delay() drin. Das ist Absicht.
Wenn der Display flackern sollte, dann kommen noch drei oder vier Zeilen Code dazu. Aber ohne delay....

[edit]
isAlpha gegen isPrintable getauscht, da ja Spaces mitkommen...

Moin, habe mal den Code getestet.
Display Zeilen laufen durch und keine Zahlen werden angezeigt.
Als Zeilenanfang muss ja das entsprechende Steuerzeichen integriert werden.

Habe Heute mal wieder etwas Zeit investiert.
Die Zeilen sind schon einigermassen lesbar, verzählt sich aber immer noch und laufen
durch.
SerialEvent07.ino (1,6 KB)

Wahrscheinlich kommen die Zeilen zu schnell. Was willst du eigentlich erreichen? Für was soll das gut sein?

Hast du diesen Code mal getestet?

Der Text über die serielle Schnittstelle (9600) auf das Display
die Erste Zeile: Sat1 Astr19 2106 (Steuerzeichen:/soh/)
Zeile zwei: NID 0085 EL 28 (Steuerzeichen: /stx/)
Je nach Sat.Konfig. verändert sich der Zeileninhalt.
Display Länge 16 Zeichen ist natürlich fest.

Das ist mir schon klar. Aber wie schnell und wann kommen die Nachrichten? Das Protokoll an sich ist ja super einfach