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.
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
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
Ich versuch das morgen
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 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.
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...
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.
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.