Serial.begin (): Dlaczego nie zawsze używać 28800?


35

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?


3
FYI najwyższy arduino podłączony do obsługi USB to tak naprawdę 115200, a 57600 jest często drugim najczęściej spotykanym bodem jaki widzisz.
— BrettAM

Odpowiedzi:


48

Dlaczego ludzie się osiedlają?

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.

Jakie jest ograniczenie ...

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.


Uwaga: 2M można archiwizować za pomocą hw serial, ale implementacja arduino wydaje się zbyt wolna i wysyła dużo śmieci. Zobacz atmega328p ds, aby znaleźć magiczny bit do podwojenia prędkości. Dodaj też, że 9800 bodów jest bardzo starym standardem, a wiele czujników używa tej wartości jako standardu, nawet jeśli można skonfigurować więcej, takich jak xbee, gps i więcej. Również szeregowe nad USB używa auto-baudrate negocjacji, które mogą przesłonić wybrane baudate, ale myślę, że nie jest używane przez arduino (ale może być na Leonardo)
— Lesto

1
9600 8N1 jest również domyślnym ustawieniem de facto. Wiele urządzeń z interfejsem szeregowym jest dostarczanych z tym ustawieniem i należy je skonfigurować, jeśli wymagana jest inna prędkość (lub dane, bit parzystości, bit stopu).
— Peter Mortensen

„jest więcej niż wystarczająco szybki” - Dobra odpowiedź, ale nieco się z tym nie zgadzam. Większość implementacji wyników debugowania jest blokowanych, dlatego bardzo pożądane jest, aby wyjście debugowania było jak najszybciej, aby zapobiec nadmiernym zmianom czasu wykonywania kodu.
— Rev1.0

Jeśli wykonujesz masowy transfer danych, najlepiej byłoby używać SPI, prawda?
— tuskiomi,

6

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.


3

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.


2

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.


0

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ść.


-2

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”.


100% hej ... ciekawe;)
— Zły 84
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.