ESP32 Bluetooth Win10 Python

OP #7313733
Lesenswert?

Hallo liebe Leute,

ich versuche mittels eines ESP32 Daten per Bluetooth zu meinem Win10 Laptop auf ein Python Programm zu senden. (Nur damit sich niemand angegriffen fühlt, ich habe das Thema im Arduino Forum bei einer anderen Frage auch schon gestellt, leider aber keine Antwort erhalten- also sorry für den "crosspost"- bin aber ziemlich verzweifelt)

Am ESP32 läuft einfach ein Testscatch:

1
#include "BluetoothSerial.h"
2

3
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
4
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
5
#endif
6

7
BluetoothSerial SerialBT;
8

9
void setup() {
10
  Serial.begin(115200);
11
  SerialBT.begin("ESP32test"); //Bluetooth device name
12
  Serial.println("The device started, now you can pair it with bluetooth!");
13
}
14

15
void loop() {
16
  if (Serial.available()) {
17
    SerialBT.write(Serial.read());
18
  }
19
  if (SerialBT.available()) {
20
    Serial.write(SerialBT.read());
21
  }
22
  delay(20);
23
}

Ich bekomme auch eine Verbindung zu Stande und sehe die com ports. Wenn ich einen Bluetooth Terminal am Laptop oder das Handy verwende kann ich auch ganz normal kommunizieren.

Ich würde gerne aber per Python mit dem ESP32 kommunizieren. Dort funktioniert zwar das senden an den ESP32 aber leider kann ich keine Daten empfangen.

Hier der Python code (Verwende Pycharm):

1
import serial
2

3
ser1 = serial.Serial('COM4')  # open serial port
4
print(ser1.name)         # check which port was really used
5
ser1.write(b'hello')     # write a string
6
ser2 = serial.Serial('COM3')  # open serial port  
7
if (ser2.isOpen()):
8
    try:
9
        while(1):
10
            print(ser2.read())
11
    except Exception:
12
        print("error")
13
 
14
ser1.close()
15
ser2.close()

auch sehe ich, dass unter den BT Einstellungen am Laptop, nur beim COM4SPP dabei steht und beim COM4 nicht- kann das was damit zu tun haben oder ist das normal?

Danke schon mal an alle die so nett sind mir zu Helfen!

Schönen Tag euch...

mfg

Gast #7313960
Lesenswert?

Du sendest in deinem python Programm zuerst 'hello', dann öffnest du den anderen Port zum Empfang und wartest auf Antwort.

Vielleicht hast du die Antwort bis dahin schon verpasst.

Ich würde zuerst beide Ports öffnen und erst dann kommunizieren. Verwendet Python eigentlich einen Empfangspuffer? Wenn nicht, musst du zwei Threads parallel laufen lassen, damit dein Programm während des Sendens auch empfangen kann.

OP #7313980
Lesenswert?

Steve van de Grens schrieb:

Du sendest in deinem python Programm zuerst 'hello', dann öffnest du den anderen Port zum Empfang und wartest auf Antwort.

Vielleicht hast du die Antwort bis dahin schon verpasst.

Ich muss die Antwort am ESP32 erst im Seriel Monitor eingeben und auf senden drücken, also glaub ich nicht, dass ich was versäumen kann.

Ich würde zuerst beide Ports öffnen und erst dann kommunizieren. Verwendet Python eigentlich einen Empfangspuffer? Wenn nicht, musst du zwei Threads parallel laufen lassen, damit dein Programm während des Sendens auch empfangen kann.

Was meinst du mit Empfangsbuffer? Hättest du eine Erklärung?

Danke

mfg

Gast #7313987
Lesenswert?

Hqwer schrieb:

Ich muss die Antwort am ESP32 erst im Seriel Monitor eingeben

Dein Quelltext zeigt, dass dein python Programm auf einem seriellen port sendet, und auf dem anderen empfängt.

Ist dein serieller Monitor an einen dritten seriellen Port angeschlossen? Irgendwie passt das nicht zu deinem Sketch, denn der benutzt nur zwei Port (UART und Bluetooth). Kannst du mal skizzieren, wie du das alles miteinander verbunden hast (bitte auch die BT Verbindung einzeichnen)?

Was meinst du mit Empfangsbuffer? Hättest du eine Erklärung?

In einem Empfangspuffer werden Daten abgelegt, die ein Gerät empfängt. Sie können dann später vom Programm verarbeitet werden. Allerdings werden diese Puffer beim öffnen des Portes normalerweise geleert, damit man keine Alten Daten verarbeitet die sich dort vor dem Programmstart angesammelt haben.

Beitrag #7314856 wurde von einem Moderator gelöscht.
OP #7314864
Lesenswert?

Hm vlt hohle ich mal aus:

Der ESP32 ist mit der Arduino IDE Programmiert Dort gibt es ja den Seriellen Monitor, wo ich mir ausgeben lasse (wie im Sketch oben) was ankommt was raus geht, gebe ich dort in dem Seriellen Monitor ein und sende es Dieser ist die Verbindung von Arduino IDE am PC zum ESP32 per USB-C.

Wie schon gesagt, kann ich mit dem PC eine BT Verbindung zum ESP32 aufbauen, also die Geräte sind gekoppelt. Wenn ich am Win10 in den "Weiteren Bluetooth Optionen" nachsehe, dann werden mir dort 2 Com Ports angezeigt (Anhang).

Hab ein einfaches Bild gezeichnet, weiß aber nicht ob das hilft (sehr rudimentär, da ich nicht wusste was du genau haben willst)

Komisch ist, dass wenn ich für die kommunikation sowas wie "tera term" (Programm aus Internet) nutze, kann ich senden und empfangen, jedoch läuft das dort alles über einen Com Port.

Ok wusste nicht das der Puffer immer geleert wird beim öffnen der verbidnung. Aber wie gesagt, in der arduino IDE welche einen Seriellen Monitor zum Anzeigen der Sachen vom ESP32 hat, muss ich einen Button betätigen zum senden der Nachricht.

Danke für deine Antworten und Hilfe!

Die einzigen Infos hinsichtlich Python-ESP32 BT im Internet sind mit der "Pybluez" Lib von Python verbunden, welche ich aber nicht installiert bekomme. Weder Pycharm noch mit pip.

Mfg

Angehängte Dateien:
OP #7314875
Lesenswert?

Da "tera term" nur über einen Poart senden, ahbe ich in meine Python Programm jetzt zwei mal den Ausgehenden Port verwendet, zum senden und lesen und es funktioniert.

Warum öffnet BT einen Port für Ausgehen und einen für Eingehend wenn dann alles nur über den Ausgehenden Port läuft?

mfg

OP #7325130
Lesenswert?

Hallo nochmals,

Könnte das jemand mit einem es32 und der board manager version 1.0.4 testen? Bei mir is (SerialBT.connected()) immer true auch wenn ich nichts verbunden habe. Jemand eine idee was da los sein könnte?

1
#include "BluetoothSerial.h"
2

3
BluetoothSerial SerialBT;
4

5
void setup() {
6
  Serial.begin(115200);
7
  SerialBT.begin("ESP32test"); //Name des ESP32
8
  Serial.println("Der ESP32 ist bereit. Verbinde dich nun über Bluetooth.");
9
}
10

11
void loop() {
12
  while (!SerialBT.connected()) {
13
    Serial.println("BT NOT connected"); //debug
14
  }
15
  if (Serial.available()) {
16
    SerialBT.write(Serial.read());
17
  }
18
  if (SerialBT.available()) {
19
    Serial.write(SerialBT.read());
20
  }
21
  delay(25);
22
}

Danke

Mfg

Gast #7325361
Lesenswert?

Hqwer schrieb:

version 1.0.4

Bist du sicher, dass du die Version 1.0.4 verwendest? Die wäre von Oktober 2019. Die relevante Codestelle wurde zuletzt vor 9 Monaten geändert.

In 1.0.4:

1
static bool waitForConnect(int timeout) {
2
    TickType_t xTicksToWait = timeout / portTICK_PERIOD_MS;
3
    return (xEventGroupWaitBits(_spp_event_group, SPP_CONNECTED, pdFALSE, pdTRUE, xTicksToWait) != 0);
4
}
5

6
bool BluetoothSerial::connected(int timeout) {
7
    return waitForConnect(timeout);
8
}

In der aktuellen Version:

1
static bool waitForConnect(int timeout) {
2
    TickType_t xTicksToWait = timeout / portTICK_PERIOD_MS;
3
    // wait for connected or closed
4
    EventBits_t rc = xEventGroupWaitBits(_spp_event_group, SPP_CONNECTED | SPP_CLOSED, pdFALSE, pdFALSE, xTicksToWait);
5
    if((rc & SPP_CONNECTED) != 0)
6
        return true;
7
    else if((rc & SPP_CLOSED) != 0) {
8
        log_d("connection closed!");
9
        return false;
10
    }
11
    log_d("timeout");
12
    return false;
13
}
14

15
bool BluetoothSerial::connected(int timeout) {
16
    return waitForConnect(timeout);
17
}

Siehe auch https://www.freertos.org/xEventGroupWaitBits.html

Offenbar wurde früher das Event SPP_CLOSED noch nicht ausgewertet.

Gast #7326175
Lesenswert?

Hqwer schrieb:

Warum öffnet BT einen Port für Ausgehen und einen für Eingehend wenn dann alles nur über den Ausgehenden Port läuft?

Woher hast du das mit Ausgehend und Eingehend? Mir scheint der eine serielle Port der SPP-Port zu sein, und der andere ist evtl. ein RAW-Port oder so ...

LG, Sebastian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren