Display zeigt bei "0" oder "10" nur Kästchen an

Hallo Leute,

ich teste gerade die serielle Kommunikation des Arduino. Schicke ich über den Seriellen Monitor eine "0" oder "10" wird die erste Zeile meines Displays komplett verpixelt (Kasten für Kasten). Bei allen anderen Zahlen und Texten funktioniert das.

Wieso ?

#include <LiquidCrystal.h>

int bufferCount;  //Anzahl der eingelesenen Zeichen
char buffer[20];  //Serial Input Buffer

LiquidCrystal lcd(12,11,5,4,3,2);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.clear();
  }

void loop() {
  // put your main code here, to run repeatedly:

}

void serialEvent() {
  char ch = Serial.read();
  buffer[bufferCount] = ch;
  bufferCount++;
  if(ch == 13){
    evalSerialData();
  }
  }

void evalSerialData()
{
  if((buffer[0] == '>') && (buffer[bufferCount - 2] == '<')){
   String cmd;
   for( int i=1; i < bufferCount - 2 ; i++){
    cmd += buffer[i];
    }
   Serial.println(cmd);
   lcd.clear();
   lcd.print(cmd);
   bufferCount = 0;
  }
  else{
    Serial.println("Befehl ungueltig!");
    bufferCount = 0;
    }
}

Wieso machst du das so doppelt gemoppelt? Du liest schon in ein Array ein, aber dann bestehst du noch drauf, das per Hand ein String Objekt draus zu machen. Wozu? Du musst nur dein Array terminieren und schon hast du einen C String (d.h. ein Null-terminiertes char Array).

Geht einfach so:
http://forum.arduino.cc/index.php?topic=329469.msg2273780#msg2273780

Danke für deine schnelle Antwort, aber das hilft mir jetzt nicht weiter.

Serial.println(cmd);

funktioniert richtg, aber

lcd.print(cmd);

zeigt Schrott an ?

Sehr merkwürdig, weil beides von derselben Basisklasse in Schleifen von unterschiedlichen write(char) Befehlen umgesetzt werden sollte.

Trotzdem, ersetze doch bitte den bescheuerten String cmd durch

  char cmd[17];
   int i;
   for(i=1; i < bufferCount - 2 ; i++)
     cmd[i-1] = buffer[i];
   cmd[i-1] = '\0'; // Endekennung
   Serial.println(cmd);
   lcd.clear();
   lcd.print(cmd);
   bufferCount = 0;

und freu dich, dass dein sketch kleiner und schneller wird :wink:

Nachtrag: Oder, wie Serenifly vorschlägt, benutze den Original-buffer:

buffer[bufferCount - 2] = 0; // >  <  abschneiden
char* cmd = buffer+1; 
Serial.println(cmd);

Ausserdem würde ich in SerialEvent

bufferCount++;

ersetzen durch

if ( bufferCount < 19) bufferCount++;

michael_x:

   char cmd[17];

for( int i=1; i < bufferCount - 2 ; i++)
    cmd[i-1] = buffer[i];
  cmd[i-1] = '\0'; // Endekennung
  Serial.println(cmd);
  lcd.clear();
  lcd.print(cmd);
  bufferCount = 0;





hier bekomme ich die Fehlermeldung: Arduino: 1.6.5 (Windows 8.1), Platine: "Arduino Uno"

Versuch2.ino: In function 'void evalSerialData()':
Versuch2:35: error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
Versuch2.ino:35:8: note: (if you use '-fpermissive' G++ will accept your code)
name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]




buffer[bufferCount - 2] = 0; // >  <  abschneiden
char* cmd = buffer+1;
Serial.println(cmd);




Hier kommt es zum selben Ergebnis. Serial.prinln zeigt es richtig an, aber mein Display zeigt nur Kästchen.

"i" ist nur innerhalb der for-Schleife bekannt.

sschultewolter:
"i" ist nur innerhalb der for-Schleife bekannt.

Da habe ich wohl die geschweiften Klammern vergessen. Danke! (Kenne ich von VB nicht)
Mit dem Code funktioniert allerdings gar nichts mehr.

Also Hintergrund der ganzen Sache ist, dass ich per VB GUI eine Zahl zwischen 0 und 65535 in eine Dezimalzahl (16bit) wandle. Diese möchte ich gerne an den µC schicken. Dieser schiebt die Zahl in zwei kaskadierte 74HC595 (Shiftregister) und diese wiederum gehen auf ULN2803A (Darlington Treiber) wo die Last dranhängt.

Meinen Code nehmen. Einmal atol() (array to long) machen und gut ist :slight_smile:

Wobei man Zahlen auch so wandeln kann, dass man die aktuelle Zahl * 10 nimmt und dann die neue Ziffer drauf addiert (ch - '0').

Also von meinem String den ich mir da bastel komme ich kaum weg. Ich kenne nur die Syntax von Visual Basic und ich finde C ist so kurz das man es kaum verstehen kann, wenn man nicht lange damit arbeitet.

Ich habe jetzt mein Display durch ein anderes ersetzt und siehe da, es zeigt mit die "0" und die "10" mit meinem Original-Quellcode an ...

Ok, wenn es geht lass es. :slight_smile: Aber wie der String aussieht ist egal. Es geht erst mal um das Einlesen. Was man dann damit macht ist was anderes.

Vielleicht irgendwo einen Wackelkontakt gehabt?

Nein, ich habe jetzt ein "besseres" Display mit HD44100H und KS0076-00 drauf :slight_smile:
Ich denke das vorherige Display hat eine Macke.

Vielen Dank für eure Hilfe. Jetzt kann ich weiter machen.

Kaum ist man mal kurz weg, hat sich alles schon erledigt. Schön!

Hab der Ordnung halber noch meinen Mist mit dem

name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]

korrigiert. Immer noch ungetestet ...


Also von meinem String den ich mir da bastel komme ich kaum weg. Ich kenne nur die Syntax von Visual Basic und ich finde C ist so kurz das man es kaum verstehen kann, wenn man nicht lange damit arbeitet.

Du hast natürlich recht, wenn du VB gewöhnt bist, ist c bisweilen kryptisch kurz und gewöhnungsbedürftig.
Und dass man sich hier lieber um jedes byte einzeln kümmert, als mit String - Objekten zu arbeiten, liegt in der Natur der kleinen Microcontroller mit wenigen Byte RAM.