Problem mit Ausgabe im seriellen Monitor

Hallo liebe Community,

ich bin gerade dabei mit 2 Arduino Unos ein Programm zur Datenübertragung mit Licht zwischen den beiden zu erstellen. Dies ist auch funktionstüchtig. Wenn ich mir jedoch im seriellen Monitor anschaue ob die Nachricht vollständig angekommen ist, fehlt jedes mal das letzte Zeichen. Wenn ich anschließend noch einen Text rüber sende, wird zunächst der Text von davor mit dem letzten Zeichen ergänzt und dann nach einem Leerzeichen weiter geprintet. Bsp. : Gesendet: HALLO ;im seriellen Monitor: HALL (beim zweiten Senden O ergänzt und dann wieder: HALL. Habe schon einige Dinge in der Logik probiert, komme aber einfach nicht drauf.

const int sensorPin = A0;
const int dotDuration = 100; // Dauer eines Punktes in ms
String receivedMorse = "";  // Morsezeichen speichern
String receivedText = "";   // Endgültiger Text speichern

struct MorseCode {
  const char* code;
  char letter;
};

// Morsecode-Tabelle zur Dekodierung
MorseCode morseTable[] = {
  {".-", 'A'},   {"-...", 'B'}, {"-.-.", 'C'}, {"-..", 'D'},
  {".", 'E'},    {"..-.", 'F'}, {"--.", 'G'},  {"....", 'H'},
  {"..", 'I'},   {".---", 'J'}, {"-.-", 'K'},  {".-..", 'L'},
  {"--", 'M'},   {"-.", 'N'},   {"---", 'O'},  {".--.", 'P'},
  {"--.-", 'Q'}, {".-.", 'R'},  {"...", 'S'},  {"-", 'T'},
  {"..-", 'U'},  {"...-", 'V'}, {".--", 'W'},  {"-..-", 'X'},
  {"-.--", 'Y'}, {"--..", 'Z'}, {"", ' '} // Leerzeichen
};

// Funktion, um Morsecode in Buchstaben umzuwandeln
char decodeMorse(String morse) {
  for (int i = 0; i < sizeof(morseTable) / sizeof(MorseCode); i++) {
    if (morse == morseTable[i].code) {
      return morseTable[i].letter;
    }
  }
  return '?'; // Falls Zeichen unbekannt ist
}

void setup() {
  
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(sensorPin);
  if (sensorValue > 250) { // Überprüfung auf den Schwellenwert
    unsigned long startTime = millis();
    while (analogRead(sensorPin) > 250);
    unsigned long duration = millis() - startTime;

    if (duration < dotDuration * 1.5) {
      receivedMorse += "."; // Kurzes Signal = Punkt
    } else {
      receivedMorse += "-"; // Langes Signal = Strich
    }
  }

  // Pause zwischen Zeichen erkennen
  if (analogRead(sensorPin) <= 250) {
    unsigned long pauseStart = millis();
    while (analogRead(sensorPin) <= 250);
    unsigned long pauseDuration = millis() - pauseStart;

    if (pauseDuration > dotDuration * 2.5) { // Lange Pause = neues Zeichen
      char letter = decodeMorse(receivedMorse);
      receivedText += letter;
      Serial.print(letter); // Direkt im Serial Monitor ausgeben
      receivedMorse = ""; // Zurücksetzen für nächstes Zeichen
    }
    
    if (pauseDuration > dotDuration * 6) { // Noch längere Pause = neues Wort
      receivedText += " ";
      Serial.print(" ");
      Serial.print(" "); // Leerzeichen zwischen Wörtern
    }
  }
} 

Ich würde mich über eine Antwort freuen. Danke im Voraus. LG

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Der naheliegendste Grund wäre, dass die Pause am Ende des Wortes nicht lang genug ist, dann hast du zwar das letzte Zeichen übernommen, es wird aber nicht direkt ausgegeben, sondern erst mit dem nächsten Zeichen.

Du gibst receivedText nirgendwo aus?
Probier mal am Ende ein println anstelle von print.

Gruß Tommy

Moin @thomas-ide ,

der Sketch bleibt m.E. nach einem erkannten Zeichen hier hängen, da die Ausgabe erst erfolgt, wenn

while (analogRead(sensorPin) <= 250);

verlassen wird. Da hilft wohl nur ein Timeout, z.B.

while (analogRead(sensorPin) <= 250 && millis()-pauseStart <= dotDuration*6);

Habe es mal hier nachgestellt:

https://wokwi.com/projects/422693755286295553

(Ich weiß, die Schaltung ist "denkwürdig", es ging so aber am Schnellsten für mich :wink: ),

ec2021

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.