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

W wielu przykładowych kodach online ludzie dodają wiersz Serial.begin(9600) w bloku konfiguracji.

Kiedy sprawdzam, co Serial.begin() znajduje się w oficjalnej dokumentacji, mówi, że kontroluje transfer danych w bitach na sekundę.

Więc oczywiste pytanie jest, dlaczego nie użyć 28800, najwyższej szybkości transferu? Dlaczego ludzie godzą się na 9600? Jakie jest tutaj ograniczenie?

Komentarze

  • Do Twojej wiadomości, najwyższe arduino podłączone do portu USB to w rzeczywistości 115200, a 57600 jest często drugim najpopularniejszym baud, widzisz.

Odpowiedz

Dlaczego ludzie osiedlić?

Ludzie się uspokajają, ponieważ jest to więcej niż wystarczająco szybkie. Najczęstszym zastosowaniem jest po prostu wydrukowanie pewnych rzeczy na terminalu w celu debugowania. 9600 bodów to 960 znaków na sekundę lub 12 x 80 linii znaków na sekundę. Jak szybko potrafisz czytać? 🙂

Jeśli twój program używa portu szeregowego do masowego przesyłania danych, wolałbyś nie dokonywać rozliczeń.

Co to jest ograniczenie …

Limity transmisji szeregowych są wysokie. Bezpośrednio możesz użyć 115200 bodów w swoich programach i 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 MB. Jeśli będziesz czytać wokół, zobaczysz, że ludzie zużyli do 1 M, bezpośrednio sterując UART. Wysokie szybkości transmisji mogą przynieść korzyści w zastosowaniach, takich jak transmisja za pośrednictwem układu Bluetooth. Jeśli używasz sprzętowego interfejsu szeregowego do wymiany z chipa na chip z niewielką odległością, wtedy 1 M baud jest całkowicie wykonalna. 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 szumem, gdy używasz sygnalizacji na poziomie logicznym (zwykłe 0 do 5 V). Aby używać większych odległości, należy dodać transceiver zapewniający solidną sygnalizację, zwykle RS-232 i rzadziej RS-485. Z RS-232 można uruchomić mega bit na dystansie 10 stóp.

Prawdziwym ograniczeniem będzie taktowanie mikroprocesora. W przypadku sprzętowego UART procesor musi załadować jeden bajt do UART co 10 bitów (dla N81). Tak więc, gdy osiągniesz 1 M bodów, wyzwaniem dla procesora 16 MHz będzie utrzymanie danych w UART. Nowy bajt będzie wysyłany co 160 tyknięć zegara, co jest bardzo małą liczbą linii kodu. W przypadku krótkiej serii danych możesz osiągnąć tę szybkość. Komunikat jest taki, że procesor wyczerpie się, zanim UART osiągnie limit.

Uwaga, to wszystko dotyczy HardwareSerial , numer seryjny oprogramowania jest bardzo inny.

Komentarze

  • Należy pamiętać, że 2M można zarchiwizować za pomocą hw serial, ale implementacja arduino ' s wydaje się zbyt wolna i wysyła dużo śmieci. Zobacz atmega328p ds, aby znaleźć magiczny bit, który podwoi prędkość. Dodaj też, że 9800 bodów to bardzo stary standard i to dużo czujników używa tej wartości standardowo, nawet jeśli można je skonfigurować dla większej liczby czujników, takich jak xbee, gps i nie tylko. Również połączenie szeregowe przez USB używa automatycznej negocjacji szybkości transmisji, która może zastąpić wybraną prędkość transmisji, ale myślę, że nie jest używana przez arduino (ale może być w Leonardo).
  • 9600 8N1 jest również de facto ustawieniem domyślnym. Wiele urządzeń z interfejsem szeregowym jest dostarczanych z tym ustawieniem i należy je skonfigurować, jeśli wymagana jest inna prędkość (lub bity danych, bit parzystości, bit stopu).
  • ” jest wystarczająco szybki ” – Dobra odpowiedź, ale nieco się z tym nie zgadzam. Większość implementacji danych wyjściowych debugowania jest blokowana, dlatego bardzo pożądane jest, aby dane wyjściowe debugowania były jak najszybsze, aby zapobiec nadmiernym zmianom w czasie wykonywania kodu.
  • Jeśli ' robisz zbiorcze przesyłanie danych, najlepiej ' używałbyś SPI, prawda?

Odpowiedź

Oprócz wszystkich interesujących odpowiedzi warto wspomnieć, że ustawienie szybkości połączenia szeregowego na XXX bity / s nie wymaga XXX bitów / s na sprzęcie.

Zegary – nawet oparte na kwarcu – są niedoskonałe i podatne na dryf. Ponadto, ponieważ zegar szeregowy jest zwykle generowany za pomocą podwójnego dzielnika wstępnego i licznika (liczby całkowitej), nie można dokładnie uzyskać wszystkich wartości, biorąc pod uwagę podstawową częstotliwość zegara. Przy pomocy bitów start / stop asynchroniczna komunikacja szeregowa może być odporna na pewne przesunięcie zegara. Ale to ma ograniczenia.

Na przykład, jeśli twój 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% (w rzeczywistości komunikuje się z prędkością 13900b / s). A przy 28800 b / s błąd wynosi + 8,5% (w rzeczywistości komunikacja z prędkością 31200 b / s).Wszystkie te dane pochodzą z arkusza danych ATmega48PA-88PA-168PA-328PA, str. 200 .

To nie problem, gdy dwa identyczne urządzenia komunikują się ze sobą (ponieważ w rzeczywistości komunikują się z tą samą prędkością). Może być problemem podczas komunikacji między różnymi urządzeniami.

Zwiększenie częstotliwości podstawowej nie musi znacząco poprawić dokładności. Na przykład uruchomienie tego samego ATmega328PA co powyżej przy 2 MHz nie daje tak naprawdę lepszych wyników, ponieważ są one głównie spowodowane błędami zaokrąglania. Jednak jego uruchomienie 1,8432 MHz zapewnia bardzo dokładne bps od 2400 b / s do 57,6 kHz.

Odpowiedź

Myślę, że to rodzaj tradycji używania szybkości transferu, która nie jest najwolniejsza (300), ale nie taka, która może ostatecznie powodować problemy w niektórych konfiguracjach (28800 lub nawet 115200). Port szeregowy komputera (najczęściej adapter USB FTDI232) może radzić sobie z wyższymi szybkościami, ale sprzęt do samodzielnego montażu może nie. Tak więc 9600 bps stało się pewnego rodzaju standardową szybkością transferu dla przykładów kodu.

Odpowiedź

W mgnieniu oka , „złotym standardem” dla zdalnych klawiatur (używających modemu telefonicznego i teletypów, jeśli je pamiętasz) było 9600 bodów, początkowo osiągalne tylko przez dedykowaną linię telefoniczną. Czas płynie powoli; postęp technologiczny, szybki; a pamięć porusza się jeszcze wolniej niż czas (wydaje się). Możemy rutynowo komunikować się, co najmniej na kilka metrów, z szybkością kilku rzędów wielkości większą niż 9600 bodów. To, co kiedyś uważano za standard złota, nie jest już złotem, ale nadal jest uważane za standard.

tl; dr: To historia, a nie technologia.

Odpowiedź

Myślę, że głównym powodem, dla którego ludzie używają 9600 przez większość czasu, jest to, że jest to domyślna szybkość transmisji w Arduino IDE. Ponadto szybsze szybkości transmisji danych mogą być również zawodne, jeśli sygnał szeregowy musi przebyć długą drogę – chociaż nie mam pojęcia, dlaczego wybrano tę prędkość jako optymalną.

Odpowiedź

Czas reakcji człowieka

Ponieważ możliwość zatrzymania monitora szeregowego, gdy Arduino szarpie się na porcie jest wymagane przez użytkowników w 100% przypadków, a maksymalna prędkość transferu jest wymagana mniej niż 100% czasu.

9600 bodów to kompromis między „łatwym do zabicia uciekającym procesem” a „irytująco wolnym”.

Komentarze

  • Hej 100% … ciekawe;)

Dodaj komentarz

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