Empfangene Zeichen über Software UART auf einmal einlesen (Arduino-Beispiel)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Empfangene Zeichen über Software UART auf einmal einlesen (Arduino-Beispiel)

      Hallo an die Experten!

      Nach etlichen Jahren Pause bin ich wieder in das Thema Mikrocontroller eingestiegen - mit einem Arduino Nano, den ich allerdings mit Bascom programmiere.

      Aktuell bin ich dabei ein HC-06 Bluetoothmodul zu konfigurieren. Senden und empfangen von Text klappt soweit, da ich mit einem ";" als String-Ende Zeichen arbeite. Ich lese also mit Inkey über die Software-Uart solange ein mit ";" kommt und schließe dann die Eingabe ab.
      Nun möchte ich das Modul aber über die AT-Befehle konfigurieren. Senden klappt, das Modul bestätigt auch:

      Ich sende: AT
      das Modul antwortet: OK

      Je nach Befehl variiert die Länge der Antwort, es folgt auch kein CR oder LF darauf. Schwierig also zu erkennen wann das Ende der Antwort erreicht ist.
      Deshalb frage ich nicht auf ein Zeichen ab sondern lasse mir sämtliche Eingangsbytes auf der HW-Uart darstellen - nach 1 Sekunde ist das Terminalfenster total überladen und gefühlt 2 Seiten weitergescrollt.

      Ich habe einen Arduino-Code den ich gefunden habe ausprobiert, klappt einwandfrei. Hier erscheint einfach ein "OK" in einer neuen Zeile und fertig.

      Gibt es so eine Möglichkeit wie
      Serial.Read
      in Bascom auch, also einfach alles was reinkommt direkt in eine Variable zu schreiben (oder noch besser, gleich auf die HW-Uart durchzuschleifen)?

      Vielen Dank für Infos!

      Grüße,

      Daniel

      Hier der Arduino-Code:

      Quellcode

      1. #include <SoftwareSerial.h>
      2. #define rxPin 2
      3. #define txPin 3
      4. SoftwareSerial BTserial(rxPin, txPin); // RX | TX
      5. void setup() {
      6. Serial.begin(9600);
      7. Serial.println("Enter AT commands:");
      8. BTserial.begin(9600);
      9. }
      10. void loop() {
      11. if (BTserial.available()) {
      12. Serial.write(BTserial.read());
      13. }
      14. if (Serial.available()) {
      15. BTserial.write(Serial.read());
      16. }
      17. }
      Alles anzeigen

    • c4vl3r schrieb:

      Nun möchte ich das Modul aber über die AT-Befehle konfigurieren.
      Die Konfiguration kannst du doch bequem direkt mit dem PC machen, das Bluetooth Modul merkt sich das.
      Wenn du es dann am AVR benutzt, ist es wie eine serielle Luftbrücke, AT Befehle werden nicht mehr gebraucht. Texte kannst du auch mit CRLF senden.

      AI2 APP Inventor 2 Teil 2 Hardware Konfiguration Bluetooth

      Was ist denn dein Problem?
    • Michael schrieb:

      Die Konfiguration kannst du doch bequem direkt mit dem PC machen, das Bluetooth Modul merkt sich das.
      Wenn du es dann am AVR benutzt, ist es wie eine serielle Luftbrücke, AT Befehle werden nicht mehr gebraucht. Texte kannst du auch mit CRLF senden.
      Das stimmt, ich will mir aber die Option offenhalten auch über den MC mit dem Modul mit AT-Befehlen kommunizieren zu können.

      Beispiel:
      Der Pin soll nachträglich geändert werden. Der neue Pin wird vom Benutzer eingegeben und gespeichert (SD,EEPROM...) Beim nächsten Neustart (HC-06 nicht verbunden, also im AT-Modus) wird dieser Wert überschrieben.

      Ist kein Must-Have, aber würde mich interessieren. Im Arduino-C scheint es ja so simpel zu sein.

      Aber Danke für deinen Hinweis!
    • c4vl3r schrieb:

      Im Arduino-C scheint es ja so simpel zu sein.
      Das hilft dir hier wenig. Hier geht es um Bascom, ein Basic-Dialekt.
      Ich könnte jetzt antworten: Dann nimm Arduino-C

      c4vl3r schrieb:

      Beim nächsten Neustart (HC-06 nicht verbunden, also im AT-Modus)
      Dann sendest du deine AT-Befehle mit Print und empfängst die Antwort mit dem seriellen Interrupt.
      Ich benutze diesen viel lieber als Input oder Inkey, da ich die Ende-Zeichen z.B. selber bestimmen kann.
      So etwa sieht das dann aus:
      AI2 APP Inventor 2 Teil 7 Bascom Programm
    • Michael schrieb:

      Das hilft dir hier wenig. Hier geht es um Bascom, ein Basic-Dialekt.
      Ich könnte jetzt antworten: Dann nimm Arduino-C
      Stimmt! Hätte ja sein können dass jemand hier in beiden Sprachen fit ist und auf Anhieb eine Lösung parat hätte :)


      Michael schrieb:

      Dann sendest du deine AT-Befehle mit Print und empfängst die Antwort mit dem seriellen Interrupt.
      Ich benutze diesen viel lieber als Input oder Inkey, da ich die Ende-Zeichen z.B. selber bestimmen kann.
      So etwa sieht das dann aus:
      AI2 APP Inventor 2 Teil 7 Bascom Programm
      Ja mit Interrupts arbeite ich bei der Software-UART auch, da gehen sonst leicht Zeichen verloren, weil nicht gepuffert.
      Danke, werde mich da noch ein wenig ausprobieren müssen um zu einer passenden Lösung zu kommen.
    • c4vl3r schrieb:

      und auf Anhieb eine Lösung parat
      das ist nicht mein Stil.
      Tut mir leid, dass ich dich da enttäuschen muss.

      c4vl3r schrieb:

      Ja mit Interrupts arbeite ich bei der Software-UART auch
      hier ist es etwas anderes. Der Interrupt wird von der Hardware-Einheit (UART) des AVRs ausgelöst.
      Das Programm springt bei Empfang eines Bytes in den Interrupt, holt es ab und gibt ihn wieder frei.

      In meinem ersten Link siehst du die AT Kommunikation.
      Es gibt bei den BT Modulen die Besonderheit, dass es keine Zeichenende-Kennung gibt.
      Auf ein AT gibt es als Antwort ein OK.

      Nach einem Print "AT" ; im Hauptprogramm (Semikolon am Ende bedeutet kein CRLF) sollte der HC06 ein O und ein K senden.
      Dazu kann man z.B. eine StringVariable mit der Länge mind. 2 anlegen und im Interrupt aufsummieren:
      Der Hilfsstring hat die Länge 1

      Interruptlabel:
      Bytevariable = Udr
      Hilfsstring = Chr(Bytevariable)
      Stringvariable = Stringvariable + Hilfsstring
      Return

      Die Bytevariable holt die Daten, die werden in einen String über die Hilfs-Variable umgewandelt und in der Stringvariable aufsummiert.

      Im Prinzip brauchst du nur die Stringvariable vor dem Senden des AT löschen und nach dem Senden ein paar Millisekunden warten, bevor du den empfangenen String auswertest.
    • Michael schrieb:

      das ist nicht mein Stil.
      Tut mir leid, dass ich dich da enttäuschen muss.
      Nein, so war es auch nicht gemeint! Sorry wenn du das falsch verstanden hast. Ich tüftel ja selbst gerne und mag keine vorgekauten Lösungen. Deswegen habe ich das Problem, obwohl es sich mit dem vorherigen Konfigurieren der Module einfach lösen lässt :)

      Danke für den Denkanstoß! Im Prinzip mach ich es ja nicht anders, Sobald mein Pin der an Int0 hängt und meine Software Uart ist, auf Low geht rufe ich die empfangenen Zeichen ab.
      Das Problem ist wie du schon sagst dass kein Zeichenende geschickt wird.

      Der Tip mit dem "OK" ist super, mir ist aufgefallen dass das HT-06 ja auf jede Config-Anweisung mit "OKxxxx" antwortet. Was nach dem "OK" ist ja eigentlich unrelevant, so dass ich eigentlich nur die zwei Zeichen abfragen muss.

      Das hilft mir doch weiter!