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.