Erstellen einer Echoskizze mit SoftwareSerial und Bluetooth

Um mein Arduino UNO + Sparkfun Bluetooth Mate Gold zu testen, habe ich diese kleine Skizze geschrieben;

#include <SoftwareSerial.h> 

SoftwareSerial softwareSerial(8, 9);

void setup() {
  softwareSerial.begin(115200);
  softwareSerial.println("Bluetooth Ready.");
  softwareSerial.println("Waiting...");

 delay(1000);
}

void loop() {
  int readByte;

  int bytes[10];

  int i = 0;
  boolean readSomething = false;

  softwareSerial.listen();

  long l = millis();
  while (millis() - l < 1000) {
    while (softwareSerial.available() > 0) {
      readByte = softwareSerial.read();
      bytes[i] = readByte;
      i++;

      readSomething = true;
    }
  }

  if (readSomething == true) {
    delay(20);
    readSomething = false;
    for (int c = 0; c < i; c++) {
      softwareSerial.print(bytes[c]);
      softwareSerial.println(" ");
      bytes[c] = 0;
    }

    i = 0;
  } 
}

Jetzt verbinde ich mich über Bluetooth über ein Terminal und sende eine Zeichenfolge an Arduino, die zurückgeschrieben wird.

Wenn ich zum Beispiel eine Zeichenfolge von '11111' sende, möchte ich etwas Konsistentes zurück - das Problem ist, dass ich etwas bekomme, das nicht konsistent ist!

Ich weiß nicht viel über Arduino, aber sind Sie sicher, dass "SoftwareSerial" tatsächlich Datenraten von bis zu 115200 unterstützt? Das wäre für eine Bit-Banged-Implementierung furchtbar hoch.
Ja, ich bin sicher. Das Problem besteht jedoch bei allen Baudraten, die ich ausprobiert habe. Also ich denke nicht, dass das das Problem ist.
OK Fair genug. Möchten Sie uns einen Hinweis darauf geben, was mit den Daten, die Sie erhalten, nicht stimmt, oder möchten Sie, dass wir weiter raten? Wenn Sie den Arduino aus dem Stromkreis nehmen und die Daten einfach am Bluetooth-Modul zurückschleifen, funktioniert es?
Wenn ich zum Beispiel fünf 1s (11111) sende, bekomme ich das zurück; 49, 152, 76, 166, 230 erstmals. Beim zweiten Senden derselben Zeichenfolge bekomme ich dies; 49, 166, 166, 70, 243. Ich finde es etwas seltsam, dass ich unterschiedliche Nummern bekomme. Vielleicht gibt es dafür ein System, aber es entzieht sich mir.
Das ist sehr interessant, denn fast alle diese Zahlen sind Bit-verschobene Versionen des korrekten Werts (49). Die 70 ist die einzige, die nicht in dieses Muster passt. Dies impliziert, dass das eine oder andere Ende der seriellen Verbindung zwischen dem Bluetooth-Modul und dem Arduino die Start- / Stoppbits aus den Augen verliert. Können Sie meine zweite Frage oben beantworten?
Wenn ich einfach direkt an das Bluetooth-Modul anschließe, kann ich es in den Befehlsmodus versetzen und Befehle senden und Antworten ganz gut zurückerhalten. Ich kann auch die Echo-Funktion aktivieren, und es funktioniert gut. Ich habe auch einige Patch-Informationen in der SoftwareSerial.cpp in Bezug auf eine kürzlich angewendete gcc-Version bemerkt. Ich weiß nicht, ob das das Problem ist, aber die Bit-Jagd ist ein bisschen außerhalb meiner Liga. Wenn Sie weitere Informationen benötigen, zögern Sie bitte nicht zu fragen.
OK, ich habe mir SoftwareSerial.cpp angesehen. Es stellt sich heraus, dass es zwei sehr unterschiedliche Implementierungen davon gibt. Die ältere Version unterstützt nur jeweils einen Port und ist nicht Interrupt-basiert. Das Timing ist sehr grob und ich würde nicht erwarten, dass es bei 115200 zuverlässig funktioniert. Die neuere Version ist Interrupt-basiert, unterstützt mehrere Ports (aber nur einen, der gleichzeitig empfängt) und scheint viel besser geschrieben zu sein, mit besserer Timing-Auflösung. Nun, hier ist die Frage: Wissen Sie, welche Version Sie verwenden?
Ich verwende die Version, die in der Arduino 1.0.1-Version für MacOS enthalten ist. Ich habe die Quelle im Internet eingefügt, damit Sie sie mit dem vergleichen können, was Sie gefunden haben. SoftwareSerial.h ( pastebin.com/8WTpUUAX ) und SoftwareSerial.cpp ( pastebin.com/t1K8a6LL ).
Ja, das ist definitiv das neuere; Es sollte in Ordnung sein. Ich versuche, einen Weg zu finden, um festzustellen, welches Ende des Links die Synchronisierung verliert ... Ich melde mich später bei Ihnen.
Können Sie eine Skizze für den Arduino schreiben, die einfach "11111" druckt und dann immer wieder für 1 Sekunde pausiert? Prüfen Sie, ob Sie diese Daten über die Bluetooth-Verbindung richtig sehen können.
Es ist nicht das Senden von Zeichen von Arduino, das ist das Problem. Ich habe diesen Code erstellt ( pastebin.com/PwyM2D6M ) und ich halte ihn am Laufen und sehe keinen einzigen Fehler (alle 1). Der fehlerhafte Code, meins oder SoftwareSerials, muss sich im empfangenden Teil befinden.
OK, wir haben das definitiv deutlich eingegrenzt. Ich denke, das nächste, was Sie versuchen sollten, ist, die Bluetooth-Schnittstelle so einzustellen, dass sie 2 Stoppbits verwendet, da die SoftwareSerial-Empfangsfunktion bei dieser Geschwindigkeit mehr als ein Bit "Totzeit" zwischen eingehenden Bytes zu benötigen scheint. Gehen Sie zurück zum Echo-Sketch und sehen Sie, ob es besser funktioniert.
Wie ich Sie verstehe, möchten Sie, dass ich das Bluetooth-Modul so konfiguriere, dass es 2 Stoppbits verwendet. Wenn ich mir die Dokumentation anschaue ( sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf ), kann ich nur einen Befehl finden, der dies tun könnte, "SQ,256". Ich bin mir nicht sicher, ob das das tut, was Sie beabsichtigen, aber ich kann Ihnen sagen, dass ich danach überhaupt nicht mehr mit dem Gerät kommunizieren kann, wenn ich diesen Befehl sende. Ich habe auch die Einstellungen des Terminals (CoolTerm) geändert, mit dem ich mich danach mit dem Bluetooth-Modul verbinde - und das so konfiguriert, dass es auch 2 Stoppbits verwendet. Irgendwelche anderen Ideen?
Nun, ich glaube, ich habe Sie so weit gebracht, wie ich konnte. Wie ich eingangs sagte, bin ich kein Arduino-Experte. Ich glaube, dass das SoftwareSerial-Modul die Wiederaktivierung von Interrupts zu lange verzögert, wodurch das Startbit des nächsten Zeichens fehlt. Ich muss mich jedoch an jemanden wenden, der viel mehr über das Arduino-Laufzeitsystem und die Interaktion von Bibliotheken wie SoftwareSerial damit weiß.
Für alle anderen, die in diesen Thread stolpern, ich habe keine Lösung gefunden - und habe stattdessen Arduino UNOs 0 und 1 (Standard-Serien-RX und TX) verwendet - und es funktioniert perfekt mit 115.200 Baud ...

Antworten (1)

Wenn Ihr Problem nur in Zeichen besteht, die Sie zurückerhalten, verwenden Sie einfach char [] array anstelle von int, z

Zeichenbytes [10];

Jetzt erhalten Sie dieselben Daten zurück.

Hoffentlich löst es Ihr Problem