-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Unverständliches Verhalten bei Bluetooth-Verbindung

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242

    Unverständliches Verhalten bei Bluetooth-Verbindung

    Anzeige

    Hallo,

    dieses Arduino-Programm empfängt Text über eine serielle Schnittstelle von einem BT-Modul und schreibt diesen in den Seriellen Monitor:

    Code:
    int led = 13;
    void setup()
    {
      Serial.begin(250000);
      Serial2.begin(9600);
    
      pinMode(led, OUTPUT);
      digitalWrite(led, LOW);
    }
    void loop()
    
    {
      if (Serial2.available())
      {
        Serial.print("value  = ");
        String value = Serial2.readStringUntil('\n');
    
        Serial.println(value);
        if (value == "*10|9|2#")
        {
          digitalWrite(led, HIGH);
        }
        else if (value == "*10|11|3#")
        {
          digitalWrite(led, LOW);
        }
    
      }
    }
    Wenn ich diese Signale von einer App "Ardroid" aus dem PlayStore sende, erscheint "value = *10|9|2#" sofort auf dem SM.
    Wenn ich diesen Text von einer mit dem AppInventor selber erstellten App sende, erscheint zuerst mit merkbarer Verzögerung "value = " und mit weiterer leichter Verzögerung dann "*10|9|2#".
    Ich kann mir das nicht erklären, wie es möglich ist, dass das Arduino-Programm den gleichen Text empfängt, aber anders reagiert.

    Den Befehlsblock im AppInventor zeigt das Bild. Was die App "Ardroid" macht weiß ich nicht.

    Klicke auf die Grafik für eine größere Ansicht

Name:	B2.jpg
Hits:	12
Größe:	81,5 KB
ID:	32408

    vG
    fredyxx

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    50
    Beiträge
    2.816
    Zitat Zitat von fredyxx Beitrag anzeigen
    Ich kann mir das nicht erklären, wie es möglich ist, dass das Arduino-Programm den gleichen Text empfängt, aber anders reagiert.
    Wie hast Du denn das Timing der beiden sendenden Applikationen verglichen, damit Du Dir sicher bist, das sich das Verhalten des Empfängers ändert?

    Wie sieht es denn aus wenn die App aus dem Playstore ein compiliertes Programm ist und der AppInventor z.B. selbst in Java geschieben ist und die Befehlsblöcke als YAIL Code von einem Interpreter verarbeitet werden?
    Dann wäre das Timingverhalten der App ganz anders wie das einer gut compilierten.
    Was das unterschiedliche Timing am Ziel eher erklärt als ein quellselektives Timingverhalten des abgebildenten Arduino Codes.

    Genau sagen könnte man das aber nur wenn man BT Sniffing betreibt und so das Zeiliche Verhalten beider Sendungen vergleichen kann.
    Oder zumindest mit einem Spectrumanalyzer das zeitliche Verhalten der gesendeten Funkwellen vergleicht.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Wie hast Du denn das Timing der beiden sendenden Applikationen verglichen, damit Du Dir sicher bist, das sich das Verhalten des Empfängers ändert?
    Das ist visuell am SM ganz deutlich zu erkennen.

    Wie sieht es denn aus wenn die App aus dem Playstore ein compiliertes Programm ist und der AppInventor z.B. selbst in Java geschieben ist und die Befehlsblöcke als YAIL Code von einem Interpreter verarbeitet werden?
    Zu diesen Details kann ich nichts sagen.

    Das unterschiedliche Timingverhalten durch die Apps könnte ich ja verstehen, aber der Arduino hat einen Empfangspuffer der seriellen Schnittstelle, da steht 2 x das gleiche drin und trotzdem ist das Verhalten des Programms deutlich unterschiedlich. Das leuchtet mir eben nicht ein.

    vG
    Fredyxx

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    50
    Beiträge
    2.816
    Ich würde schon auf der Senderseite schauen.
    Code:
    value = *10|9|2#
    1234567812345678
    Beim einen mal bekommst Du 16 Byte Nutzdaten am Stück beim anderen je 8 Byte und dann wieder 8 Byte.

    Versuch doch mal 18-22 Zeichen zu senden und schau mal was da vom Timing her passiert.
    Das müsste ja, wenn es Byteweise aufgeteilt wird, bei AppInventor noch langsamer gehen und dann auch auf drei mal kommen.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    3.071
    woher weisst du, dass es am Empfänger / dem Arduino liegt?
    Es könnte doch auch an unterschiedlich schnellen Sendern liegen?

    Nur ein mögliches Erklärungsmodell, es kann ntl auch andere Ursachen haben:

    Sobald nur 1 einziges angekommenes Zeichen das "available" anzeigt, gibt der Arduino bereits aus:

    if (Serial2.available()) {
    Serial.print("value = ");

    da muss der Rest der Zeichen noch gar nicht da sein.
    Denn jetzt fängt er erst an, den Rest des Strings einzulesen:

    String value = Serial2.readStringUntil('\n');
    Serial.println(value);

    Wenn die ganzen Zeichen nun lange brauchen, bis sie Sender-seitig hinterhergedackelt kommen, dauert es halt mal mehr, mal weniger lange, bis alle vorhanden sind und vollständig angezeigt werden können. Dabei werden sie nicht byte-weise geschrieben, so wie sie eintrudeln, sondern erst, wenn sie vollständig sind, d.h. wenn der string bis zum '\n' vollständig ist!
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Beim einen mal bekommst Du 16 Byte Nutzdaten am Stück beim anderen je 8 Byte und dann wieder 8 Byte.
    Verstehe ich leider nicht. "value = " kommt ja nicht vom Tablet, sondern vom MEGA an SM.

    Versuch doch mal 18-22 Zeichen zu senden und schau mal was da vom Timing her passiert.
    Ändert nichts.

    Sobald nur 1 einziges angekommenes Zeichen das "available" anzeigt, gibt der Arduino bereits aus:

    if (Serial2.available()) {
    Serial.print("value = ");

    da muss der Rest der Zeichen noch gar nicht da sein.
    Denn jetzt fängt er erst an, den Rest des Strings einzulesen:
    Wäre eine Möglichkeit. Würde aber doch bedeuten, dass der Sendebefehl meiner App den Text byteweise rüberschickt, während Ardroid den Text immer als Block sendet. Es müsste also unterschiedliche Sendebefehle geben.

    Ich habe auch mal hinter "if (Serial2.available())" ein delay (1000) eingefügt, was aber nur das "value = " verzögert, die Verzögerung zum *10|9|2# bleibt aber trotzdem. Ich dachte, damit den eintrudelnden Bytes die Zeit zu geben, die sie bis zum letzten Zeichen brauchen. Oder ruht bei delay auch das Einlesen der Zeichen von der SS?

    Noch mal zur Erinnerung: mit Ardroid kommt "value = *10|9|2#" immer sofort und gleichzeitig!

    Ich habe mal 2 Videos angefügt. Die sind zwar verwackelt und verschwommen, lassen aber den Unterschied trotzdem erkennen.





    Danke für eure Ideen.

    vG
    fredyxx
    Geändert von fredyxx (10.02.2017 um 23:43 Uhr)

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.379
    du musst die videos bei youtube öffentlich machen...
    gruß inka

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Habe ich gemacht!

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.379
    hab mir die videos angesehen, das unterschiedliche verhalten würde ich den unterschiedlichen "sender" apps zuschreiben. Übrigens, soviel ich weiss, blockiert ein delay wirklich alles...
    gruß inka

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Zitat Zitat von inka Beitrag anzeigen
    hab mir die videos angesehen, das unterschiedliche verhalten würde ich den unterschiedlichen "sender" apps zuschreiben. Übrigens, soviel ich weiss, blockiert ein delay wirklich alles...
    Aber du kannst mir wohl auch nicht sagen, wie man einen Sendebefehl, anders als oben gezeigt, ausführen kann, damit er wie bei der App "Ardroid" wirkt.

    vG

    fredyxx

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Bluetooth Verbindung "verlängern"
    Von meddie im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 9
    Letzter Beitrag: 28.06.2016, 17:28
  2. RP6 - Bluetooth keine Verbindung!?!
    Von Philsuro im Forum Robby RP6
    Antworten: 4
    Letzter Beitrag: 18.01.2011, 21:52
  3. Antworten: 2
    Letzter Beitrag: 02.05.2010, 14:51
  4. Bluetooth-Verbindung auf LCD
    Von otis im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 20.08.2007, 10:54
  5. Antworten: 1
    Letzter Beitrag: 21.09.2006, 17:45

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •