Aus Char einen String machen

Hallo,

ich habe folgendes Script geschrieben:

ich bekomme von einer PS/2 Tastatur Eingaben in einem char.

Wie kann ich diesen Char immer zu einem String hinzufügen.

und zweite Frage:

Wie kann ich das letzte Zeichen aus einem String löschen?

Viele Grüße
Jannis

Hier wird von der seriellen Schnittstelle eingelesen (die erste Version):
http://forum.arduino.cc/index.php?topic=361111.msg2494595#msg2494595

Das geht sehr ähnlich mit anderen Quellen auch. Und statt ein Linefeed als Endezeichen könntest du Enter/Return nehmen. Also das hier anpassen:

else if (c == '\n' && index > 0)

Und statt auf '\n' (LF) auf eine Abschluss-Taste abfragen. Aber irgendwie musst du mal das Ende feststellen!

Wobei ich das bei einer Tastatur eher so umschreiben würde, dass nach jedem Tastendruck der String terminiert ist und das nicht nur einmal am Ende geschieht. Dann kann man auch teilweise eingelesene Strings anzeigen. Dazu könnte man auch am Anfang einmal den String mit memset() auf 0 setzen (also wenn Zeichen eingelesen und index == 0).
Außerdem kann man readSerial() so umschreiben dass statt einem bool ein unsigned char zurückgegeben wird. Dann kann man 0 für "nichts gedrückt", 1 für "Taste gedrückt" und 2 für "String fertig eingelesen" nehmen.

Wie kann ich das letzte Zeichen aus einem String löschen?

strlen() - 1 (Länge des Strings - 1) gibt dir den letzten Index in einem C-String an. Den setzt du auf 0/NULL/'\0'

Damit wollte ich schon länger mal spielen. Aber ich bin nie dazu gekommen. Ist aber sehr einfach. Hier sind zwei Lösungen.
Bei der ersten wird nach jedem gültigem Tastendruck der gesamte String ausgegeben. Bei der zweiten einfach immer nur der nächste Buchstaben dazugeschrieben. Bei Backspace/Delete muss man auf Serial den gesamten Text neu schreiben. Auf einem LCD könnte man auch gezielt den letzten Buchstaben löschen.

Das Löschen des letzten Buchstabens habe ich anders gemacht. Da man sich sowieso den nächsten zu schreibenden Index im Array merken muss, kann man auch den zum Löschen des letzten Buchstabens merken. Also braucht man strlen() nicht unbedingt.

100% getestet ist es nicht

#include <PS2Keyboard.h>

const int SERIAL_BUFFER_SIZE = 21;
char stringBuffer[SERIAL_BUFFER_SIZE];

enum { READ_NONE, READ_KEY, READ_DONE };

const int DataPin = 3;
const int IRQpin = 2;

PS2Keyboard keyboard;

void setup()
{
  Serial.begin(9600);
  keyboard.begin(DataPin, IRQpin, PS2Keymap_German);
  Serial.println(F("Keyboard Test"));
}

void loop()
{
  int value = readKeyboard();

  if (value == READ_DONE)
  {
    Serial.println(F("Done!"));
    Serial.print(F("Read: ")); Serial.println(stringBuffer);
  }
  else if (value == READ_KEY)
  {
    Serial.println(stringBuffer);
  }
}


int readKeyboard()
{
  static byte index;

  if (keyboard.available())
  {
    char c = keyboard.read();

    if (index == 0)
      memset(stringBuffer, 0, sizeof(stringBuffer));

    if (c == PS2_DELETE && index > 0)
    {
      stringBuffer[--index] = '\0';
      return READ_KEY;
    }
    if ((c >= ' ' && c <= '~') && index < SERIAL_BUFFER_SIZE - 1)
    {
      stringBuffer[index++] = c;
      return READ_KEY;
    }
    else if (c == PS2_ENTER)
    {
      index = 0;
      return READ_DONE;
    }
  }

  return READ_NONE;
}
#include <PS2Keyboard.h>

const int SERIAL_BUFFER_SIZE = 21;
char stringBuffer[SERIAL_BUFFER_SIZE];

enum { READ_NONE, READ_DONE };

const int DataPin = 3;
const int IRQpin = 2;

PS2Keyboard keyboard;

void setup()
{
  Serial.begin(9600);
  keyboard.begin(DataPin, IRQpin, PS2Keymap_German);
  Serial.println(F("Keyboard Test"));
}

void loop()
{
  int value = readKeyboard();
  
  if (value == READ_DONE)
  {
    Serial.println(F("\nDone!"));
    Serial.print(F("Read: ")); Serial.println(stringBuffer);
  }
  else if (value == PS2_DELETE)
  {
    Serial.println(F("\nDelete: ")); 
    Serial.print(stringBuffer);
  }
  else if (value != READ_NONE)
  {
    Serial.print((char)value);
  }
}


int readKeyboard()
{
  static byte index;

  if (keyboard.available())
  {
    char c = keyboard.read();

    if (index == 0)
      memset(stringBuffer, 0, sizeof(stringBuffer));

    if (c == PS2_DELETE && index > 0)
    {
      stringBuffer[--index] = '\0';
      return c;
    }
    if ((c >= ' ' && c <= '~') && index < SERIAL_BUFFER_SIZE - 1)
    {
      stringBuffer[index++] = c;
      return c;
    }
    else if (c == PS2_ENTER)
    {
      index = 0;
      return READ_DONE;
    }
  }

  return READ_NONE;
}