Co to jest Serial.begin (9600)?

22

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

Serial.begin(9600);

Ale chcę wiedzieć, co to naprawdę znaczy?

shajib0o
źródło
3
Dokumentacja ma dobry opis. arduino.cc/en/Serial/begin
sachleen

Odpowiedzi:

22

Serial.begin(9600)tak naprawdę nic nie drukuje. W tym celu chcesz Serial.print("Hello world!")wydrukować tekst „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 twój komputer) muszą być ustawione tak, aby używały połączenia szeregowego o tej samej prędkości w celu uzyskania dowolnego rodzaju zrozumiałych danych. Jeśli istnieje rozbieżność między tym, co dwa systemy uważają za prędkość, dane zostaną zniekształcone.

9600 bitów na sekundę jest domyślnym ustawieniem 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łby Arduino na transmisję z prędkością 57600 bitów na sekundę. Musisz ustawić dowolne oprogramowanie, z którego korzystasz na komputerze (np. Monitor szeregowy Arduino IDE), na tę samą prędkość, aby zobaczyć wysyłane dane.

heypete
źródło
2
Baud i BPS to dwie różne rzeczy ... nie mogę znaleźć linku, którego szukałem teraz.
Anonimowy pingwin
co jeśli wstawię „Serial.begin (0);” lub „Serial.begin (4000);”. Chcę wiedzieć, jaka jest różnica między liczbami?
shajib0o
3
Serial.begin służy do ustawiania prędkości komunikacji w bitach na sekundę. Jeden bajt jest równy 8 bitom, ale połączenia szeregowe wysyłają bit startu i stopu w celu zidentyfikowania początku i końca określonego bajtu w systemie odbiorczym. Zatem do wysłania jednego znaku potrzeba 10 bitów. Użycie Serial.begin(0)informuje Arduino, że powinien komunikować się z 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 wyśle ​​dane z prędkością 4000 bitów na sekundę. Jest to niestandardowe, ale poza tym w porządku.
heypete
2
W skrócie: zmiana liczby zmienia prędkość. Zmniejszenie liczby (np. Serial.begin(300)) Powoduje, że Arduino wysyła dane wolniej. Zwiększając go, powiedzmy do 57600 wyśle ​​dane szybciej. Zarówno system wysyłający, jak i system odbierający muszą uzgodnić, jakiej prędkości użyć: program szeregowy komputera, taki jak okno Arduino Serial Monitor, pozwoli Ci ustawić prędkość, z jaką komputer odbiera dane, ale możesz wybrać tylko typowe prędkości: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 i 11520 bitów / s. Nie można wprowadzać innych prędkości, np. 4000. 9600 jest zwykle dobra.
heypete
Baud and BPS are two different things... can't find the link I was looking for now.- Oto jedno wyjaśnienie: Dodatek C: „baud” vs. „bps”
Nick Gammon
21

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

Skonfigurowałem Uno, aby wysyłał „Fab” z prędkością 9600 bodów i przechwycił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 należy zauważyć, że linia danych Tx (transmisja) jest zwykle wysoka (1), dopóki nie opadnie nisko, wskazując początek znaku (bajtu). To jest bit startowy . Następnie 8 bitów danych (oznaczonych białymi kropkami) pojawia się przy szybkości transmisji (9600 próbek na sekundę). Następnie linia jest ponownie podnoszona. To jest bit stopu (czerwona część). Następnie widzimy bit startowy dla następnej postaci i tak dalej. Część „stop” może być nieskończenie długa, jednak musi mieć co najmniej jeden bit długości.


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

Komunikacja szeregowa - jeden bajt

  • A - brak danych (Tx jest wysoki)

  • B - „Bit startowy”. Linia jest niska, aby poinformować odbiorcę, że znak (bajt) zaczyna być wysyłany. Odbiornik czeka półtorej godziny zegarowej przed próbkowaniem linii.

  • C - Nadchodzi pierwszy znak (litera „F” lub 0x46 lub 0b01000110). Jako taki nie ma bitu zegarowego, przychodzące dane są po prostu próbkowane z szybkością transmisji (transmisji). W przeciwieństwie do komunikacji SPI, dane przychodzą najpierw jako najmniej znaczący bit (w przypadku, gdy nie wysyłasz 8 bitów na bajt). Widzimy więc 01100010 (zamiast 01000110).

  • D - Bit stopu. Jest to zawsze wysoka wartość, aby zapewnić rozróżnienie między końcem tego bajtu a początkiem następnego. Ponieważ bit startowy jest zerem, a bit stopowy jest jeden, zawsze istnieje wyraźne przejście z jednego bajtu do następnego.

  • E - Bit startowy dla następnego znaku.


Z przechwytywania analizatora logicznego można zobaczyć, że T1 - T2wynosi 0,1041667 ms, a tak się składa, że ​​wynosi 1/9600:

1 / 9600 = 0.00010416666 seconds

Zatem szybkość 9600 daje liczbę bitów na sekundę, a odwrotność to przedział czasowy między bitami .


Inne uwagi

  • Szeregowe połączenia nie są taktowane (w przeciwieństwie do SPI lub I2C i innych), dlatego nadawca i odbiorca muszą uzgodnić częstotliwość taktowania.

  • Częstotliwość taktowania nie jest dokładna w Arduino, ponieważ sprzęt musi podzielić zegar systemowy na niższy, 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, takie jak na Uno):

    Błąd szybkości transmisji szeregowej

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

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

    • Jeśli określisz parzystość „nieparzystą”, bit parzystości jest ustawiony w taki sposób, że całkowita liczba 1-bitów jest nieparzysta.
    • Jeśli określisz parzystość „parzystą”, bit parzystości jest ustawiony w taki sposób, że całkowita liczba 1-bitów jest parzysta.
    • Jeśli nie podasz parzystości, bit parzystości zostanie pominięty.

    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 wykorzystywany jako 9 bit danych. Dlatego nie możesz mieć zarówno 9 bitów danych, jak i bitu parzystości.

  • Możesz także mieć dwa bity stopu. Zasadniczo wydłuża to czas między bajtami. W „dawnych czasach” było tak, że powolny sprzęt elektromechaniczny mógł przetwarzać poprzedni bajt (np. Go wydrukować).


Możliwe uszkodzenie

Jeśli zaczniesz nasłuchiwać danych szeregowych w środku strumienia, całkiem możliwe, że 0-bit w środku strumienia zostanie zinterpretowany jako bit początkowy, a następnie odbiornik zinterpretuje wszystko niepoprawnie.

Jedynym prawdziwym sposobem na odzyskanie tego jest od czasu do czasu wystarczająco duża przerwa (np. 10 bitów), aby tak się nie stało.


Odwrócona logika

Pokazane tutaj bity (poziom logiczny) nie są odwrócone. Oznacza to, że 1-bit jest WYSOKI, a 0-bit jest NISKI. Jeśli masz sprzęt RS232, który prawdopodobnie wysyła coś w rodzaju -12 V dla 1-bitowego i +12 V dla 0-bitowego. Jest to odwrócone, ponieważ jeden jest mniejszy od zera, pod względem napięcia.

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


Praktyczna zasada prędkości

Ponieważ z jednym bitem początkowym, 8 bitami danych i jednym bitem stop mamy w sumie 10 bitów, zgodnie z ogólną zasadą można obliczyć liczbę bajtów, które można przesłać w ciągu sekundy, dzieląc przepływność przez 10 .

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


Kod do reprodukcji:

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

void loop ()
  {
  }
Nick Gammon
źródło
1

; TLDR; Inicjuje port komunikacji szeregowej i ustawia prędkość transmisji. Urządzenie, z którym się komunikujesz (lub Arduino IDE Serial Monitor), musi być ustawione na pasującą prędkość transmisji. Po zainicjowaniu portu możesz rozpocząć wysyłanie lub odbieranie znaków. Arduino Serial Reference

linhartr22
źródło
Nie umniejszaj ani nie lekceważ doskonałego pokrycia tego tematu przez Nick-Gammona.
linhartr22