W wielu przykładowym kodzie online ludzie dodają wiersz Serial.begin(9600)
w bloku instalacyjnym.
Kiedy sprawdzam, co Serial.begin()
jest w oficjalnej dokumentacji, mówi, że kontroluje przesyłanie danych w bitach na sekundę.
Oczywistym pytaniem jest, dlaczego nie zastosować 28800, najwyższej prędkości transferu? Dlaczego ludzie decydują się na 9600? Jakie jest tutaj ograniczenie?
Odpowiedzi:
Ludzie osiedlają się, ponieważ jest wystarczająco szybki. Najczęstszym zastosowaniem jest po prostu wydrukowanie niektórych rzeczy na terminalu w celu debuggowania. 9600 bodów to 960 znaków na sekundę lub 12 x 80 znaków na sekundę. Jak szybko potrafisz czytać? :)
Jeśli Twój program korzysta z portu szeregowego do masowego przesyłania danych, nie zdecydujesz się na rozliczenie.
Limity na serial są wysokie. Bezpośrednio możesz użyć 115200 bodów w swoich programach i to po prostu zadziała. Terminal Arduino pozwoli na maksymalnie 115200, ale inne programy, takie jak RealTerm, pozwolą ci działać wyżej.
Szeregowy sprzęt będzie działał z prędkością 1 M bodów. Jeśli będziesz czytać, zobaczysz, że ludzie zużyli do 1 M, bezpośrednio kontrolując UART. Możesz skorzystać z wysokich prędkości transmisji w zastosowaniach takich jak transmisja przez układ Bluetooth. Jeśli używasz sprzętowego interfejsu szeregowego do wymiany między układami z niewielkiej odległości, to 1 M bodów jest całkowicie wykonalny. Pomyśl o wszystkich urządzeniach SPI i I2C, które działają dobrze przy częstotliwości taktowania 1 MHz.
Na większych odległościach zaczniesz mieć problemy z hałasem podczas korzystania z sygnalizacji poziomu logicznego (zwykłe od 0 do 5 V). Aby korzystać z większych odległości, należy dodać nadajnik-odbiornik zapewniający niezawodną sygnalizację, zwykle RS-232 i rzadziej RS-485. Z RS-232 możesz biegać mega bit na odległościach 10 stóp.
Rzeczywistym ograniczeniem będzie szybkość zegara mikroprocesora. W przypadku sprzętowego UART procesor musi ładować jeden bajt do UART co 10 bitów (dla N81). Kiedy więc osiągniesz 1 M bodów, procesor 16 MHz będzie wyzwaniem, aby UART był zasilany danymi. Nowy bajt będzie wysyłany co 160 tyknięć zegara, co stanowi bardzo niewiele wierszy kodu. W przypadku krótkiej serii danych możesz osiągnąć ten wskaźnik. Komunikat jest taki, że procesorowi skończy się prędkość, zanim UART będzie limitem.
Uwaga: wszystko to dotyczy HardwareSerial , oprogramowanie szeregowe jest bardzo różne.
źródło
Oprócz wszystkich interesujących odpowiedzi, warto wspomnieć, że ustawienie szybkości szeregowej na XXX bitów / s nie musi oznaczać XXX bitów / s na sprzęcie.
Zegary - nawet oparte na kwarcu - są niedoskonałe i podlegają dryfowaniu. Ponadto, ponieważ zegar szeregowy jest zwykle generowany za pomocą licznika potęgi dwóch dzielników wstępnych i licznika (liczb całkowitych), nie można dokładnie uzyskać całej wartości, biorąc pod uwagę podstawową częstotliwość zegara. Za pomocą bitów start / stop asynchroniczna komunikacja szeregowa może tolerować pewne przesunięcia zegara. Ale to ma ograniczenia.
Na przykład, jeśli ATmega328PA pracuje z częstotliwością 1 MHz, możesz osiągnąć 9600b / s przy 0,2% błędu. Ale przy 14400b / s błąd wynosi -3,5% (faktycznie komunikuje się przy 13900b / s). A przy 28800b / s błąd wynosi + 8,5% (faktycznie komunikuje się przy 31200b / s). Wszystkie te dane pochodzą z arkusza danych ATmega48PA-88PA-168PA-328PA, p200 .
To nie problem, gdy dwa identyczne urządzenia komunikują się ze sobą (jak istnieją w rzeczywistości komunikowania się w tej samej prędkości). Może to stanowić problem podczas komunikacji między różnymi urządzeniami.
Zwiększenie częstotliwości podstawowej nie musi znacznie poprawiać dokładności. Na przykład uruchomienie tego samego ATmega328PA jak powyżej przy częstotliwości 2 MHz nie daje tak naprawdę lepszych wyników, ponieważ są one głównie spowodowane błędami zaokrąglania. Ale uruchomienie 1,8432 MHz zapewnia bardzo dokładne bps od 2400b / s do 57,6 kHz.
źródło
Myślę, że tradycją jest używanie prędkości transferu, która nie jest najwolniejsza (300), ale też nie taka, która może ostatecznie powodować problemy w niektórych konfiguracjach (28800 lub nawet 115200). Port szeregowy komputera (najczęściej adapter FTDI232 USB) może poradzić sobie z wyższymi prędkościami, ale twój sprzęt może nie. Tak więc 9600 bps ustanowiło się jako rodzaj standardowej szybkości przesyłania dla przykładów kodu.
źródło
W dawnych czasach „złoty standard” zdalnych klawiatur (przy użyciu modemu telefonicznego i teletypów, jeśli je pamiętasz) wynosił 9600 bodów, początkowo osiągalny tylko przez dedykowaną linię telefoniczną. Czas płynie powoli; postęp technologiczny, szybko; a pamięć porusza się nawet wolniej niż czas (wydaje się). Możemy rutynowo komunikować się, przynajmniej na kilku metrach, z kilkoma rzędami wielkości szybciej niż 9600 bodów. To, co kiedyś było uważane za standard złota, nie jest już złotem, ale nadal jest uważane za standard.
tl; dr: To historia, nie technologia.
źródło
Myślę, że głównym powodem, dla którego ludzie najczęściej używają 9600, jest to, że jest to domyślna prędkość transmisji w Arduino IDE. Również wyższe prędkości transmisji danych mogą być niewiarygodne, jeśli sygnał szeregowy musi przebyć długą drogę - chociaż nie mam pojęcia, dlaczego wybrano to jako optymalną prędkość.
źródło
Czas reakcji człowieka
Ponieważ możliwość zatrzymania monitora szeregowego, gdy Twój Arduino rzuca się na port, jest wymagany przez użytkowników w 100% przypadków, a maksymalna prędkość transferu jest wymagana w mniej niż 100% czasu.
9600 bodów to kompromis pomiędzy „łatwym zabiciem niekontrolowanego procesu” a „denerwująco powolnym”.
źródło