Empfangsproblem von Daten über Serial - nur 12 Zeichen

Hallo

Ich habe mit einem Sketch versucht über ein Bluetoothmodul Daten zu empfangen und am Serial Monitor am PC anzuzeigen. Die Daten werden über das Handy an das Bluetoothmodul gesendet. Ich sende zum Beispiel einen Text, von dem Text werden aber maximal 15 Zeichen empfangen. Liegt dies am String den ich definiert habe? Wie kann ich mehr als 15 Zeichen empfangen?

#include <SoftwareSerial.h>   //adds library for software serial (Bluetooth module)

const unsigned long Baudrate = 2400;   //starts serial port with a baudrate by 2400 b/s
const unsigned long BaudrateBT = 2400; //starts serial port for the Bluetooth module with a baudrate by 2400 b/s

const byte Bluetooth = 11;         //Bluetooth Module connected to pin D11

String BT_RX;       //reads the letter from Bluetooth serial

//create software serial ports
SoftwareSerial BT(Bluetooth, 19);  //RX, TX pin from Bluetooth module

void setup() {

  BT.begin(BaudrateBT);     //starts serial port with a baudrate by "BaudrateBT" (b/s)
  BT.setTimeout(3);         //sets the maximum milliseconds to wait for serial data
  Serial.begin(Baudrate);       //starts serial port with a baudrate by "Baudrate" (b/s)

}

void loop() {

//read software serial and send it via software serial xx to the device
  while (BT.available() > 0) {             //while serial is available, make...
    BT_RX = BT.readString();               //store received string from serial to BT_RX
    Serial.print(BT_RX);                       //send string from BT_RX
    Serial.print('\r');                        //send carriage return
  }

}

//GND der externen Stromversorgung vom Teeces an den Arduino geführt.

Grüsse

Stef

Mit welcher Geschwindigkeit?

Mach mal:


const unsigned long Baudrate = 115200;
const unsigned long BaudrateBT = 9600;

Ausgabe?

Die Baudraten habe ich schon versucht zu erhöhen, verringern und unterschiedlich zu setzen. Gibt immer das selbe Ergebnis. Es werden maximal 15 Zeichen gesendet, resp. am Serial Monitor angezeigt. Wenn ich z.B. 1MHALLO2MHUHU3MHAHA0T100 sende, dann bekomme ich nur 1MHALLO2MHUHU3M aus.

3ms Timeout sind bei so niedrigen Baudraten etwas problematisch. Ein Zeichen braucht 1 / Baudrate * 10 Sekunden

Und vor allem die Hardware Baudrate zur Ausgabe kannst du viel höher setzen auch wenn die BT Baudrate niedrig bleiben muss. Selbst wenn das vielleicht nicht das eigentliche Problem ist

Ok, kann ich machen.
Sind denn bei einem String die Anzahl Zeichen begrenzt auf 15? Ich finde das etwas merkwürdig mit genau maximal 15 Zeichen.

Bei 9600 sollte ggü. 2400 schon mehr rumkommen.
Wenn das nicht geht, ist der Puffer eher leer, bevor die nächsten Zeichen kommen.

Ja, sollten etwa 4x soviel ankommen. Ich werde sonst morgen mal nochmals die Baudraten anpassen und vielleicht auch mal das Timeout rausnehmen, resp. verringern versuchen.

Nein. Wenn man es richtig macht (d.h. die Daten schnell genug aus dem Eingangspuffer entfernt) gibt es keine Beschränkung. Und auch der serielle Eingangspuffer hat weit mehr als 15 Zeichen

Du kannst mal testweise die Zeichen direkt einzeln auf die andere Schnittstelle durchreichen anstatt den ganzen String einzulesen.

Nachtrag:
Du kannst mal nachschauen ob es bei deinem Bluetooth Modul irgendwelche Beschränkungen gibt. Das ist möglich. Am Arduino selbst liegt das jedenfalls nicht

Erhöhen in diesem Fall! Die Timeout Zeit ist die Zeit die in der Methode auf das nächste Zeichen gewartet wird. Die ist standardmäßig mit 1 Sekunde extrem hoch, aber in diesem Fall sollte sie auch nicht zu niedrig sein. Bei 2400 Baud sind da mindestens 5ms angebracht

Kannst Du noch heute?

#include <SoftwareSerial.h>
SoftwareSerial BT(11, 19); // RX, TX
void setup()
{
  Serial.begin(115200);
  BT.begin(38400);
  delay(10);
}

void loop()
{
  if (BT.available())
  {
    Serial.write(BT.read());
  }
}

Die 38400 dann nach und nach runter, wenn es nicht geht.
19200, 9600, 4800

Was kommt raus?

Ich versuch das morgen :wink:
Das Bluetoothmodul immer wieder neu einzustellen ist ein etwas grösserer Aufwand da nur mit AT Befehlen möglich. Muss da alles umverkabeln, dem PC die Ports einstellen... das braucht Zeit. Muss morgens um vier wieder aufstehen! Morgen Abend nehm ich mir Zeit.
Ich habe aber bereits mit den Baudraten etwas rumgespielt, was ich dabei aber nicht verändert hab, war die Baudrate des Arduinos. Das möchte ich auch noch versuchen.
Und das timeout habe ich so gemeint, dass ich die Geschwindigkeit verringere, also die Lesezyklen vergrössere. Das versuche ich dann mal zuerst. Das ist das schnellste zu testende.

Hmpf! Nicht jammern...
Nicht mal Nein sagen.
Wenn nicht ist, ist nicht.
So ist es.

Nimm meinen Sketch - teste das mit Deinem Sender.
Setze Baud bei beiden so, das Du das heraus bekommst, was Du sendest.
Gib die Einstellungen hier bekannt.

Das reicht um weiter zu arbeiten.

Das ist nicht "etwas problematisch" , sondern schlicht die (Haupt-)Ursache für das beobachtete Verhalten. Natürlich kann man an den Baudraten rumspielen, aber wenn einem nicht klar ist, was bei readString zeitlich abläuft, tapst man doch ziemlich im Nebel.

Der Eingangspuffer ist normalerweise 64 Zeichen groß. Wenn das reicht, sollte man sich lieber Zeit lassen und alles möglichst einfach realisieren.

Strings wurden eigentlich zur Vereinfachung erfunden. Wenn sie stattdessen nur Probleme machen, wie der Vorschlag von @my_xy_projekt zeigt,

der einfach und sicher bei jeder Geschwindigkeit funktioniert,
sollte man vielleicht einfach auf readString verzichten.

Du hast in deinem Code eine Methode namens setTimeout(). Dann hat "Timeout" eine ganz spezielle Bedeutung. Und bei der Baudrate von 2400 Baud oder niedriger ist die Zeit von 3ms sehr relevant! Das geht schlichtweg so nicht weil die Lese-Methode abbricht bevor das nächste Zeichen da ist. Bei höheren Baudraten reichen 3ms dagegen.

Also, ich habe nun die Baudraten 2400, 9600, 19200 und 38400 auf dem Bluetooth Modul eingestellt. Dies habe ich sowohl mit höheren Baudraten am seriellen Ausgang des Arduinos der dies am Seriellen Monitor anzeigt, als auch mit niedrigeren Baudraten gemischt und versucht. Es gibt immer mit allen Kombinationen das gleiche Resultat:

Ich sende einen String mit z.B. 1MTEXT2MTEXT3MTEXT0T100
Davon erhalte ich 1MTEXT2MTEXT3MTEXT

Wenn ich z.B. 1MHALLO2MHANS3MGUSTAV0T100 sende:
Erhalte ich 1MHALLO2MHANS3MGUS

Wenn ich z.B. 1MHAHA2MHUHU3MHOHO0T100 sende,
erhalte ich 1MHAHA2MHUHU3MHOHO

Sende ich jetzt 1MHAHA2MHUHU3MHO0t100
erhalte ich 1MHAHA2MHUHU3MHO0

Und bei 1MHAHA2MHUHU3M0t100
erhalte ich 1MHAHA2MHUHU3M0t1

Es ist vollkommen egal welche Baudraten ich nutze, es kommt immer das heraus.

Das set.Timeout habe ich zum Test natürlich auch mal weggelassen. Macht überhaupt keinen Unterschied, nur ist es viel langsamer beim Empfangen.

Das mit dem String habe ich schon gegen normal read und write getauscht, dann muss ich den "String BT_RX" den ich definiert habe um die Daten zu speichern die gelesen werden in einen char wandeln, da ich ja Text und Zahlen empfange/weitersende. Damit habe ich auch keinen Erfolg verzeichnen können. Ich sende genau das gleiche wie im Beitrag *14 gepostet, erhalte auch das gleiche wie dort gepostet. Es fehlt immer der letzte Teil. Es scheint immer nur 17 bis 18 Zeichen zu empfangen.

Also das:

1MTEXT2MTEXT3MTEXT

sind 18 Zeichen - ggfls. +2 für \r\n
Unten sinds dann 17 (+x)

Damit sind es nicht 15.
Und es sind auch nicht 12.

Nur rein informativ: Die Baudrate für den SerMon auf 115200 stehen lassen - da brauchst nichts dran ändern.

Mit was sendest Du die Daten?
Gehen da überhaupt die Anzahl Bytes gleichzeitig zu senden?

Was benutzt Du für ein BT-Modul?

Genau, ich habe nur Testweise auch für den Seriellen Ausgang die Baudraten gewechselt um da eine Veränderung zu checken.

Ja, das ist so! Zählen ist manchmal eine Kunst... :expressionless:

Per Handy/App. Das Buetoothmodul ist ein HC-08. Ich habe nicht speziell was gefunden um einzustellen das die Daten beschränkt. Es ist als Slave konfiguriert.

Auf meinem Tisch liegt ein Messer.
Sage mir, ob es eine Waffe ist.

Ist ein Bluetoothterminal, BT Terminal. Ich habe auch mit einer App aus AppInventor versucht die ich gemacht habe, hat aber immer alles gesendet wie es soll. Habe ich per Handy - Tablet Verbindung untereinander gesendet und empfangen um das zu kontrollieren. Dort liegt der Fehler kaum.

Aus der Doku:

Ich sage Dir, das mit den 20 hatte ich doch schon oben...

Du hast irgendwo ein Problem, das das nächste Paket nicht mehr da ist.
Noch ein edit:
Hast Du den Sketch aus Empfangsproblem von Daten über Serial - nur 12 Zeichen - #9 by my_xy_projekt
genommen?
Stelle den für BT.Serial auf 9600
Ergebnis?