Wpis z mikrobloga

#arduino #esp32 #programowanie

Mam problem z komunikacją po bluetooth.
Chcę wyświetlić proste menu. Pierwsza opcja to pobranie imienia i nazwiska. Pozostałe opcje to pierdoły.
Pierwszy problem: program napiernicza tym menu do klienta - no wiadomo, w pętli jest...
Jak to sensownie wyświetlić raz, gdy klient się podłączy?
Gorszy problem, wybór menu działa ale po dokonaniu wyboru opcji 1, owszem pyta o imie i nazwisko ale olewa całkiem dane z bluetooth. Nie czeka na dane, nie wczytuje aż nastąpi podanie znaku \n. Wywalone, przelatuje przez to...

#include <BluetoothSerial.h>

// utwórz obiekt BluetoothSerial
BluetoothSerial SerialBT;

void setup() {
// inicjalizuj Bluetooth SerialBT
SerialBT.begin("ESP32 Bluetooth");
}

void loop() {
// wyświetl menu
SerialBT.println("Wybierz opcję:");
SerialBT.println("1. Wprowadź imię i nazwisko");
SerialBT.println("2. Wyślij 'Witaj'");

// sprawdź, czy jest dostępny nowy strumień danych
if (SerialBT.available()) {
// odczytaj dane z Bluetooth SerialBT
String dane = SerialBT.readStringUntil('\n');

// usuń końcowy znak nowej linii
dane.trim();

// sprawdź wybraną opcję
if (dane == "1") {
// opcja 1: wczytaj imię i nazwisko
SerialBT.println("Wprowadź imię:");
String imie = SerialBT.readStringUntil('\n');
imie.trim();

SerialBT.println("Wprowadź nazwisko:");
String nazwisko = SerialBT.readStringUntil('\n');
nazwisko.trim();

SerialBT.println("Witaj, " + imie + " " + nazwisko);
}

else if (dane == "2") {
// opcja 2: wyślij "Witaj"
SerialBT.println("Witaj");
}

else {
// nieznana opcja: wyślij komunikat o błędzie
SerialBT.println("Nieznana opcja");
}
}
}
  • 3
Jak to sensownie wyświetlić raz, gdy klient się podłączy?


@defoxe: nie da się, bo nie wiesz kiedy klient się podłącza. Możesz co najwyżej zareagować na jakiś klawisz, np. Enter, albo ctrl-l i wyświetlić ponownie menu. Możesz też po stronie klienta użyć terminala, który rozumie kody sterujące np. VT100 (putty) i wtedy przed wyświetleniem menu możesz kazać wyczyścić ekran, żeby nie było ściany tekstu.
@zetisdead z tego co wyczytalem, da sie rozpoznac kiedy klient sie podlacza. Natomiast dalej mam problem z sensownym wczytywaniem tekstow. Powoli problem koslawo rozwiazuje ale jestem ciekaw jak to inni robia, moze bardziej poprawnie.
@defoxe: jeśli chodzi o pojedyncze wyswietlenie komuniaktu to sprobuj:

if (SerialBT.connected()) wyswietlKomunikat();
jesli chodzi o to ze kolejne wywolania readStringUntil nie zwracaja nic to pewnie problem ze bufor odbiorczy jest pusty w momencie gdy probujesz go czytac, przed kazdym odczytem musisz sprawdzic z SerialBT.available() IMO. Mozesz sprobowac wymusisz odczekanie na bufor przez dodatkowe petle:

while (!SerialBT.available()) sleep(50);
String imie = SerialBT.readStringUntil('\n');

Co do tego "jak to inni robią" to co probujesz