Bluetooth bzw. serielle übertragungsfehler?

Hallo,
Ich habe das btm222 Bluetooth Modul verlötet und an den Arduino angeschlossen. (Mit Spannungswandler-schaltung, da der btm mit 3,3V und der Arduino (zumindest auf den RX/TX Pins) mit 5V arbeitet.
Ich verwende einen Arduino Uno von Sainsmart.

Ich übertrage nun Werte mit dem Handy (Testfall: 1m Entfernung). Die Werte sind ints von 0-255. Die kommen am Arduino dann als String über die Serielle Schnittstelle (ich nutze Softwareserial auf den Pins 3 und 5, da ich bei Benutzung von 0 und 1 das USB Kabel jedes mal abstecken müsste)

Problem: ganz ab und zu, kommen solche Zeichen an:

Damit die Bits/bytes nicht durcheinander gewürfelt werden, habe ich keine while(Serial.available) verwendet, sondern lese jeden Loop-durchlauf die ankommenden bytes, und konkatiere sie in einem String namens rx :

character = btm222_serial.read();
rx.concat(character);

Egal wie schnell der Arduino, oder wie langsam die Übertragung mal ist, es wird somit gewartet bis alles da ist. Trennzeichen (wird vom Handy hinter Jede Nachricht gehängt, ist ein Fragezeichen: "?")
Auf dem Arduino so gelöst:

if(character=='?'){
verarbeite(rx);
rx = "";

Damit sollte nichts durcheinander geraten.
Die Zeichen treten trotzdem auf, müssten meiner Meinung nach also Fehler in der BT Übertragung sein. Sind recht selten, kann ich aber überhaupt nicht gebrauchen. Mir würde es reichen, diese Werte zu ignorieren, was ich mit dieser Methode versucht habe:

boolean isValidNumber(String str){
  for(byte i=0;i<str.length();i++){
    if(isDigit(str.charAt(i))) return true;
  }
  return false;
}

dazu natürlich #include <ctype.h> im Kopf eingefügt.

Manchmal funktioniert das, manchmal kommen die Zeichen aber unerkannt durch. vielleicht weil die bytes dann als "tiefgestellte 2" oder ähnlich erkannt werden... Das System darf solche Werte aber nicht bekommen. Ich will solche Werte filtern und ignorieren. Es kommen immernoch genug richtige Werte pro Sekunde an.

Habt ihr Tipps wie ich entweder die BT Übertragung (übrigens mit 38400 BAUD, vorher mit 19200, gleiches Problem) verbessern, oder die Werte richtig filtern kann?

Kann ich seitens des Handys (Android) etwas verbessern ? Sende einfach mit nem Outstream:

byte[] msgBuffer = message.getBytes();
		try {
			outStream.write(msgBuffer);

Falls es das schon 100x gab, bitte einfach den Link posten. Ich habe bereits stunden gegoogelt und konnte nichts finden, was mich wirlich weiterbringt.

Ach gott. Nachricht mühsam und detailliert formuliert, nach dem Abschicken auf Fehler kontrollieren, da fällt das auf:

Die Methode isValidNumber bricht ja beim ersten validen Digit ab. Nur wenn ALLES KEINE Digits sind, endet die Schleife und es wird mit false beendet. Ich will aber abbrechen, sobald MIN. eines falsch ist.
sähe dann so aus:

boolean isValidNumber(String str){
  for(byte i=0;i<str.length();i++){
    if(!isDigit(str.charAt(i))) return false;//abbrechen, wenn ein zeichen keine Ziffer ist
  }
  return true; //wird nur erreicht, wenn ALLE Zeichen gültige Ziffern waren.
}

Hätte die Methode nicht aus einem Forum kopieren sollen. Hatte nach diesem isDigit gegoogelt und dachte, ich kanns mir sparen die 5 zeilen selbst zu schreiben... :smiley:

Vielleicht hat ja trotzdem noch jemand einen Tipp was den Rest angeht. :slight_smile:
Ansonsten bitte ignorieren.

SoftwareSerial is für ....
Nehm die AltSoftSerial. Des weiteren ist dein Code zu unvollständig. Man kann nicht sehen, welche Libs du nutzt. Des weiteren while(Serial.available), du sagst doch, du nutzt SoftwareSerial.

ich wollte nur sagen, ich nutze keine while schleife um auf die Daten zu warten. habe es hier so reingetippt, natürlich ist es "mySerial.available".

KYL3R:
ich wollte nur sagen, ich nutze keine while schleife um auf die Daten zu warten. habe es hier so reingetippt, natürlich ist es "mySerial.available".

Trotzdem: Nimm die AltSoftSerial-Library!

Die zur Arduino-IDE mitgelieferte SoftwareSerial ist die schlechteste von allen zur Arduino-IDE mitgelieferten Libraries und dafür bekannt, reichlich und vielfältige Übertragungsfehler zu produzieren, insbesondere bei Baudraten über 4800, bei gleichzeitiger Verwendung von HardwareSerial oder bei anderen laufenden Interrupts auf dem Controller.