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.
Zeile beginnt mit SOH (Start of Heading)
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
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.
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.
/*
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
/*
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;
}
}
/*
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)
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.