Czym jest Serial.begin (9600)?

Wiem, że to ma na celu zainicjowanie czegoś:

Serial.begin(9600); 

Ale chcę wiesz, co to naprawdę oznacza?

Komentarze

Odpowiedź

Serial.begin(9600) właściwie niczego nie drukuje. W tym celu” chciałbyś użyć Serial.print("Hello world!") do wydrukowania tekstu ” Witaj świecie!” do konsoli szeregowej. Raczej inicjuje połączenie szeregowe z prędkością 9600 bitów na sekundę.

Obie strony połączenia szeregowego (tj. Arduino i komputer) muszą być ustawione na używanie połączenia szeregowego o tej samej szybkości, aby uzyskać dowolny rodzaj zrozumiałych danych. Jeśli występuje niedopasowanie między tym, co te dwa systemy uważają za prędkość, dane będą zniekształcone.

9600 bitów na sekundę jest domyślnym dla Arduino i jest całkowicie wystarczające dla większości użytkowników, ale możesz zmienić to na inne prędkości: Serial.begin(57600) ustawiłoby Arduino na transmisję z prędkością 57600 bitów na sekundę. Musisz ustawić dowolne oprogramowanie, którego używasz na swoim komputerze (np. Szeregowy monitor Arduino IDE) z tą samą prędkością, aby zobaczyć przesyłane dane.

Komentarze

  • Baud i BPS to dwie różne rzeczy … nie mogę ' znaleźć odnośnika, którego szukałem teraz.
  • co jeśli wstawię ” Serial .begin (0); ” lub ” Serial.begin (4000); ” . Chodzi mi o to, że chcę wiedzieć, jaka jest różnica między liczbami?
  • Serial.begin służy do ustawiania szybkości komunikacji w bitach na sekundę. Jeden bajt to 8 bitów, ale połączenia szeregowe wysyłają bit początku i końca, aby zidentyfikować początek i koniec określonego bajtu do systemu odbierającego. Zatem do wysłania jednego znaku potrzeba 10 bitów. Użycie Serial.begin(0) mówi Arduino, że powinien komunikować się z interfejsem szeregowym z prędkością 0 bitów na sekundę. Jak można się spodziewać, oznacza to, że Arduino nigdy nie wyśle żadnych danych. Serial.begin(4000) spowoduje, że Arduino będzie wysyłać dane z prędkością 4000 bitów na sekundę. To jest niestandardowe, ale poza tym w porządku.
  • Krótko mówiąc: zmiana liczby zmienia prędkość. Zmniejszenie liczby (np. Serial.begin(300)) powoduje wolniejsze wysyłanie danych przez Arduino. Zwiększenie go, powiedzmy, do 57600 spowoduje szybsze wysyłanie danych. Zarówno system wysyłający, jak i odbierający muszą uzgodnić, jakiej szybkości użyć: program szeregowy komputera ', taki jak okno Arduino Serial Monitor, pozwoli Ci ustawić szybkość, z jaką Twój komputer odbiera dane, ale możesz wybrać tylko jedną z typowych szybkości: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 i 11520 bitów / sek. Możesz ' t wprowadzić inne prędkości, na przykład 4000. 9600 jest zwykle dobre.
  • Baud and BPS are two different things... can't find the link I was looking for now. – Tutaj ' s jedno wyjaśnienie: Dodatek C: ” baud ” a ” bps ”

Odpowiedź

Obraz jest wart 1000 słów, więc mówią, (1024 słowa, jeśli pracujesz z komputerami), więc opublikuję kilka zdjęć …

Skonfigurowałem Uno, aby wysyłał „Fab” z prędkością 9600 bodów i przechwytywałem wyniki na analizatorze logicznym.

Komunikacja szeregowa - 3 litery

Części zacieniowane na czerwono to okres” bezczynności „między bajtami.

Z powyższej grafiki zauważ, że Linia danych Tx (transmisja) jest zwykle wysoka (1), dopóki nie spadnie nisko, aby wskazać początek znaku (bajtu). To jest bit początkowy . Następnie 8 bitów danych (oznaczonych białymi kropkami ) pojawiają się przy szybkości transmisji (9600 próbek na sekundę). Następnie linia zostaje ponownie podniesiona. To jest bit stopu (część czerwona). Następnie widzimy początek dla następnego znaku i tak dalej. Część „stop” może mieć nieskończoną długość, jednak musi mieć co najmniej jeden bit.


Więcej szczegółów na temat pierwszego znaku (litera „F” lub 0x46 lub 0b01000110) można podać widać tutaj:

Komunikacja szeregowa - jeden bajt

  • A – brak danych (sygnał jest wysoki)

  • B – „Bit startu”. Linia ma niski poziom, aby poinformować odbiorcę, że rozpoczyna się wysyłanie znaku (bajtu). Odbiornik czeka przez półtorej godziny przed próbkowaniem linii.

  • C – Nadchodzi pierwszy znak (litera „F” lub 0x46 lub 0b01000110). Nie ma bitu zegara jako takiego, przychodzące dane są po prostu próbkowane z szybkością transmisji (baud). W przeciwieństwie do komunikacji SPI dane docierają najpierw do najmniej znaczącego bitu (w przypadku, gdy nie wysyłasz 8 bitów na bajt). W ten sposób widzimy 01100010 (zamiast 01000110).

  • D – Bit stopu. Jest to zawsze wysokie, abyśmy mogli odróżnić koniec tego bajtu od początku następnego. Ponieważ bit startu to zero, a bit stopu to jedynka, zawsze występuje wyraźne przejście z jednego bajtu do drugiego.

  • E – Bit startowy dla następny znak.


Na podstawie przechwycenia analizatora logicznego możesz zobaczyć, że T1 - T2 wynosi 0,1041667 ms, a gdy to się dzieje czyli 1/9600:

1 / 9600 = 0.00010416666 seconds 

Zatem współczynnik 9600 daje liczbę bitów na sekundę , a odwrotnością jest odstęp czasu między bitami .


Inne uwagi

  • Komunikacja szeregowa nie jest taktowana samodzielnie (w przeciwieństwie do SPI lub I2C i innych), dlatego zarówno nadawca, jak i odbiorca muszą uzgodnić częstotliwość zegara.

  • Częstotliwość zegara nie jest dokładna w Arduino, ponieważ sprzęt musi podzielić zegar systemowy w dół, aby uzyskać zegar szeregowy, a podział nie zawsze jest dokładny. Prawie zawsze występuje błąd, kwota jest podana w arkuszu danych (liczby podane dla zegara systemowego 16 MHz, takiego jak na Uno):

    Błąd szybkości transmisji szeregowej

  • Możesz zmieniać liczbę bitów danych, których nie musisz wysyłać 8 z nich, w rzeczywistości możesz wysłać od 5 do 9 bitów.

  • Opcjonalnie może być wysłany bit parzystości po bitach danych.

    • Jeśli określisz parzystość „nieparzystą”, bit parzystości jest ustawiany w taki sposób, że całkowita liczba bitów 1 jest nieparzysta.
    • Jeśli określisz parzystość „parzystą” , bit parzystości jest ustawiany w taki sposób, że całkowita liczba bitów 1 jest parzysta.
    • Jeśli nie określisz parzystości, bit parzystości jest pomijany.

    Może to pomóc odbiorcy wykryć, czy dane dotarły poprawnie, czy nie.

  • Bit parzystości jest wysyłany przed bitem stopu.

  • W przypadku 9 bitów danych (używanych w protokole SeaTalk) bit parzystości jest ponownie używany jako dziewiąty bit danych . Dlatego nie możesz mieć zarówno 9 bitów danych, jak i bitu parzystości.

  • Możesz również mieć dwa bity stopu. To po prostu wydłuża czas między bajtami. dni ”było to tak, że powolny sprzęt elektromechaniczny mógł przetworzyć poprzedni bajt (np. aby go wydrukować).


Możliwe uszkodzenie

Jeśli zaczynasz słuchać danych szeregowych w środku strumienia, jest całkiem możliwe, że bit 0 w środku strumienia zostanie zinterpretowany jako bit początkowy, a następnie odbiornik zinterpretuje wszystko po tym nieprawidłowo.

Jedynym prawdziwym sposobem na wyjście z tego problemu jest uzyskanie od czasu do czasu wystarczająco dużej przerwy (np. 10 bitów), aby tak się nie stało.


Odwrócona logika

Bity pokazane tutaj (poziom logiki) nie są odwrócone. Oznacza to, że 1 bit to WYSOKI, a 0 bit to NISKI. Jeśli masz sprzęt RS232, który prawdopodobnie będzie wysyłał coś takiego jak -12 V dla 1-bitowego i +12 V dla 0-bitowego. Jest to odwrócone, ponieważ jeden jest mniejszy a zero, pod względem napięcia.

Jeśli masz takie urządzenia, musisz wykonać konwersję napięcia i odwrócenie logiki. Chipy takie jak MAX232 zrobią jedno i drugie za Ciebie. Mogą również zapewnić -12 V potrzebne do napędzania takiego sprzętu, generując je wewnętrznie za pomocą kilku kondensatorów dostarczonych przez użytkownika.


Praktyczna reguła prędkości

Ponieważ z jednym bitem startu, 8 bitami danych i jednym bitem stopu mamy w sumie 10 bitów, na przykład można obliczyć liczbę bajtów możesz przesyłać w ciągu sekundy, dzieląc szybkość transmisji przez 10.

Np. Przy 9600 BPS możesz wysłać 960 bajtów na sekundę.


Kod do odtworzenia:

 void setup() { Serial.begin(9600); Serial.print("Fab"); } void loop () { }  

Odpowiedź

; TLDR; Inicjalizuje port komunikacji szeregowej i ustawia prędkość transmisji. Urządzenie, z którym się komunikujesz (lub monitor szeregowy Arduino IDE) musi być ustawione na odpowiednią prędkość transmisji. Po zainicjowaniu portu można rozpocząć wysyłanie lub odbieranie znaków. Numer seryjny Arduino

Komentarze

  • Nie umniejszać ani nie lekceważyć @ Nick- Gammon ' doskonale omawia ten temat.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *