Forum: Mikrocontroller und Digitale Elektronik ESP32 Bluetooth Win10 Python


von Hqwer (mr_n)


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

: Bearbeitet durch User
von Steve van de Grens (roehrmond)


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.

von Hqwer (mr_n)


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

von Steve van de Grens (roehrmond)


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.

: Bearbeitet durch User
Beitrag #7314856 wurde vom Autor gelöscht.
von Hqwer (mr_n)


Angehängte Dateien:

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

: Bearbeitet durch User
von Hqwer (mr_n)


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

von Hqwer (mr_n)


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

: Bearbeitet durch User
von Steve van de Grens (roehrmond)


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.

: Bearbeitet durch User
von Sebastian (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.