diff --git a/ampel-firmware/ampel-firmware.ino b/ampel-firmware/ampel-firmware.ino
index 3fdfbd0af2fa535961b2b0efa0d9e986db3dfa45..ff83379cffac9d74810dde453a86f26dc34b9f5c 100644
--- a/ampel-firmware/ampel-firmware.ino
+++ b/ampel-firmware/ampel-firmware.ino
@@ -147,9 +147,8 @@ void loop() {
   // Short press for night mode, Long press for calibration.
   checkFlashButton();
 
-  if (Serial.available() > 0) {
-    commandString = Serial.readStringUntil('\n');
-    sensor_commands::run(commandString.c_str());
+  while (Serial.available() > 0) {
+    sensor_commands::processIncomingByte(Serial.read());
   }
 
   if (sensor::processData()) {
@@ -171,7 +170,7 @@ void loop() {
     max_loop_duration = duration;
     Serial.print(F("Debug - Max loop duration : "));
     Serial.print(max_loop_duration);
-    Serial.println(" ms.");
+    Serial.println(F(" ms."));
   }
 }
 
diff --git a/ampel-firmware/sensor_commands.cpp b/ampel-firmware/sensor_commands.cpp
index d9644dd9e8cadd5202e3f6010087329101776056..3b4d56b82d8ae89b87218cd8951a6afc62323a05 100644
--- a/ampel-firmware/sensor_commands.cpp
+++ b/ampel-firmware/sensor_commands.cpp
@@ -77,6 +77,26 @@ namespace sensor_commands {
     return code;
   }
 
+  // http://www.gammon.com.au/serial
+  void processIncomingByte(const byte input_byte) {
+    static char input_line[MAX_COMMAND_SIZE];
+    static unsigned int input_pos = 0;
+    switch (input_byte) {
+    case '\n': // end of text
+      input_line[input_pos] = 0;
+      run(input_line);
+      input_pos = 0;
+      break;
+    case '\r': // discard carriage return
+      break;
+    default:
+      // keep adding if not full ... allow for terminating null byte
+      if (input_pos < (MAX_COMMAND_SIZE - 1))
+        input_line[input_pos++] = input_byte;
+      break;
+    }
+  }
+
   void listAvailableCallbacks() {
     for (uint8_t i = 0; i < callbacks_count; i++) {
       Serial.print("  ");
@@ -106,7 +126,7 @@ namespace sensor_commands {
           Serial.println(")");
           callbacks[i].intFunction(argument);
         } else {
-          Serial.println();
+          Serial.println("()");
           callbacks[i].voidFunction();
         }
         return;
diff --git a/ampel-firmware/sensor_commands.h b/ampel-firmware/sensor_commands.h
index dd321c29016e399e8a0ccd8e3e54cdc4d4b306d7..ac73d066d02c55d55c13208051f148dbd7a88df9 100644
--- a/ampel-firmware/sensor_commands.h
+++ b/ampel-firmware/sensor_commands.h
@@ -7,6 +7,7 @@
  */
 
 namespace sensor_commands {
+  void processIncomingByte(const byte in_byte);
   void run(const char *command);
   void defineIntCallback(const char *command, void (*function)(int32_t), const char *doc);
   void defineCallback(const char *command, void (*function)(void), const char *doc);