Skocz do zawartości

Wyświetlanie tekstu przez Serial


Pomocna odpowiedź

@AndrzejRa witam na forum 🙂 Z jakiego monitora portu szeregowego korzystasz? Czy te kwadraty wyświetlają się tylko podczas pierwszego uruchomienia programu (zaraz po wgraniu), czy po resecie jest identyczny efekt?

Dziękuję

rozumiem warunek,

while (!Serial);

choć nie rozumiem jak to działa? Sugerujesz, że tekst rozpoczyna się wyświetlać zanim port się otworzy/otworzy i oczyści?

 

  • Lubię! 1

while (!Serial); jest używany z Arduino Leonardo czy MICRO, gdzie port USB musi się uruchomić wewnątrz uC, dla UNO czy NANO jest osobny chip działający niezależnie od stanu uC programowanego przez użytkownika Arduino. 

W sumie to nie napisałeś jakie Arduino ma te dolegliwości, ale dodanie w setup jakiegoś delay (10) by nie zaszkodziło w żadnym, od podania napięcia na układ mija parę us, zanim napięcia się ustabilizują na wyjściach IO i zaczną odzwierciedlać intencje twórcy programu.

  • Lubię! 1
1 godzinę temu, AndrzejRa napisał:

 Sugerujesz, że tekst rozpoczyna się wyświetlać zanim port się otworzy/otworzy i oczyści?

 

Nic nie sugeruję. Nie używam płytek arduinowych, więc nie znam niuansów ich "wewnętrznego życia" 🙂

Uruchom kod i zobacz czy pomoże. Albo podłącz to do mądrzejszego terminala (np Realterm) i zobacz jakie kody ascii tam na początku wypluwa.

A w sumie podanie płytki na której się pracuje nie byłoby głupim pomysłem... tak samo jak podanie współpracującego softu.

Ale co ja tam wiem... przecież ja nawet kursu Arduino nie skończyłem 😞

  • Lubię! 1

Płytka to arduio uno, a edytor to IDE Arduino i jego monitor.

Nie musisz być złośliwy myślałem, że w Arduino jest jakiś ekstra sposób na czyszczenie pamięci o którym nic nie mogłem znaleźć. Do tej pory pisząc cokolwiek nie musiałem się zastanawiać czy sprzęt zdąży coś uruchomić, dokładnie zmierzyć, czy ustabilizować napięcia.

sposób z dopisaniem while (!Serial) i pustymi wąsami zadziałał. Nie bardzo rozumiałem dlaczego. Domyślam się, że sprawdzenie warunku musiało dać czas, żeby wszystko zadziałało.

(edytowany)

A swoją drogą, dlaczego while (!Serial); nie wywala błędu? Rozumiał bym coś w stylu while (!Serial.ok());  "Serial" jest obiektem (?) więc mamy negację obiektu. Poza tym, skoro wróciło z "Serial.begin(...)" to nigdy nie powinno być null. Jak dokładnie to działa?

Edytowano przez bjrk
(edytowany)
4 godziny temu, bjrk napisał:

A swoją drogą, dlaczego while (!Serial); nie wywala błędu? Rozumiał bym coś w stylu while (!Serial.ok());  "Serial" jest obiektem (?) więc mamy negację obiektu. Poza tym, skoro wróciło z "Serial.begin(...)" to nigdy nie powinno być null. Jak dokładnie to działa?

HardwareSerial.h:135

operator bool() { return true; }

Oznacza, że jak Serial jest prawidłowym obiektem to zwróci true. W przypadku kodu portu USB operator trochę bardziej skomplikowany i bierze pod uwagę to, czy USB CDC zostało zainicjowane poprawnie.

Dla przykładu w rdzeniu RP2040 funkcja operatora dla USB Serial wygląda tak:

SerialUSB::operator bool() {
    CoreMutex m(&__usb_mutex, false);
    if (!_running || !m) {
        return false;
    }

    tud_task();
    return tud_cdc_connected();
}

Operator if(Serial) można zapisać jako

if((bool) Serial) // ...

A przeciążając operator konwersji daliśmy kompilatorowi informację co ma w tym miejscu począć, stąd nie wrzuca błędów 😉 

Stąd też działają negacje. W przypadku pętli while zmienia się tylko operator z if na while 😉 

Edytowano przez H1M4W4R1
  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...