Arduino Nano - HC05 Bluetooth Incoming String Länge

Hallo Leute,

folgende Frage zum Thema aus der Überschrift.
Habe hier einen Code, der Bluetooth Daten empfängt und diese in einen Bufferspeicher schiebt.
Nun meine Frage:
Ich würde gerne überprüfen, wie lange der Incoming String ist, bevor die If schleife den bufferspeicher mit den Werten befüllt.

ich frage mit if ja schon ab, ob der Incomingstring nur Zeichen oberhalb des Leerzeichens im ascii code besitzt.
Da würde ich auch gleich gerne abfragen wollen wie lange der ist ... Soll mind 25 Zeichen haben, darunter soll der bufferspeicher garnicht erst neu befüllt werden.
Kann mir jemand helfen ?
```
*#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 4
#define BtPin 8
SoftwareSerial bt (txPin, rxPin); // tx , rx

void setup() {
 
  bt.begin(9600);
  Serial.begin(9600);
  Serial.println("Arduino bereit...");
  Serial.println("Bluetooth bereit...");
  Serial.print("Sketch:  ");  Serial.println(FILE);
  Serial.print("Uploaded: ");  Serial.println(DATE);
 
}

void loop() {

BluetoothDatenLesenUndVerarbeiten();
}

void BluetoothDatenLesenUndVerarbeiten() {

char bufferspeicher[25];
  char IncomingString = '0';
  int i = 0;
  memset(bufferspeicher, 0, sizeof(bufferspeicher));

while (bt.available() > 0)
  {
    delayMicroseconds(1250);
    IncomingString = bt.read();

if (IncomingString > 32 ) // Nur Zeichen mit ASCII-Code oberhalb Leerzeichen
    {
      bufferspeicher[i] = IncomingString;
      i++;
    }
  }

if (strstr(bufferspeicher, "#") == bufferspeicher) {

Serial.print("String erkannt: ");
    Serial.println(bufferspeicher);

}

}*
```
a
Danke im voraus, euer Franz

Wenn Du vor dem Befüllen des Puffers die Länge wissen willst, dann muss sie der Sender vor dem Inhalt schicken.
Ansonsten den Puffer normal füllen und wenn er zu kurz ist, leeren und nicht auswerten.

Gruß Tommy

Hey Tommy,

wie mache ich das am besten?

Nach dem Empfangen leeren und verwerfen?
Bzw wo kann ich das am besten abfragen, bei mir im Codebeispiel

Muss ja irgendwie den gesamten Abfragen, es kommt ja jedes Zeichen nach dem anderen einzeln rein.

Gruß

Hi

Wenn Du die Zeichen einzeln empfängst, wirst Du Diese wohl auch einzeln in den Puffer rein schreiben.
Wenn Du nun merkst, daß Da kein Platz mehr ist - Du würdest über die Grenze des Puffer schreiben, Was gaaanz böse ist und zu undefiniertem Verhalten führen kann(wird) - DANN merkst Du Dir, daß die Sendung fehlerhaft ist, leerst den Puffer und wartest auf den Anfang einer neuen Sendung.
Alternativ stellst Du irgendwann (irgendwie) fest, daß die Sendung fertig ist - dann steht Diese jetzt im Puffer - die Länge hast Du mitgezählt oder die Leerzeichen am Ende des Puffer stören nicht: Auswerten.
Wenn die Auswertung erfolgt ist, Puffer leeren und einen neuen Empfang erlauben (Flag setzen oder was in der Richtung).

Wenn Dir Das nun rein gar Nichts sagt - Wie würdest Du vorgehen, wenn Dir Deine Mutter einzeln Buchstaben sagt und Du die darin enthaltene Nachricht erkennen willst?
... da Deine Mutter langsamer ist als sonst, bekommst Du nur jeden Tag einen Buchstaben - Du wirst Dir also Diese notieren müssen.
Wenn am Ende Deines Schmierzettel kein Platz mehr ist und Du darin keine Nachricht erkennen kannst, musst Du

  • von Vorne anfangen
  • den Inhalt der Puffer um 1 verschieben und die letzte Stelle, das jetzige Zeichen, eintragen
  • oder was ganz Anders

MALE Dir auf, wie Du das Problem lösen willst - möglichst kleine Zwischenschritte!
Je kleiner die Zwischenschritte, desto weniger Zeilen Code benötigen diese Einzelschritte und sind 'erschlagbar'.

MfG

Franz_grundi:
wie mache ich das am besten?

Welche von beiden Varianten? Für 2. hat Dir ja schon postmaster-ino mögliche Wege aufgezeigt.

Für 1. musst Du in den Sender eingreifen. Der weiß ja, was er alles senden will. Also in einer Schleife über die Message zählen und die Zahl als erstes Byte senden.

Ist das Ende Deiner Message irgendwie gekennzeichnet (LineFeed, '\0', ...)?

Gruß Tommy

Danke für die super Erklärung Postmaster-ino :slight_smile:

Werde mal sowas versuchen dass ich es genau aufzeichne wie es sein soll in das dann programmiere.

Ja Tommy, das Ende der Message ist gekennzeichnet.
Sobald ein % Zeichen kommt, weiß der Controller das ist das Ende dieser Sendung.