Serial.begin (): De ce nu folosiți întotdeauna 28800?

În multe dintre exemplele de cod online, oamenii adaugă linia Serial.begin(9600) în blocul de configurare.

Când caut ce este Serial.begin() în documentația oficială, spune că controlează transferul de date pe biți pe secundă.

Deci, întrebarea evidentă este, de ce nu folosiți 28800, cea mai mare rată de transfer? De ce oamenii se mulțumesc cu 9600? Care este limitarea aici?

Comentarii

  • FYI cel mai mare arduino conectat la suporturile USB este de fapt 115200, iar 57600 este adesea al doilea cel mai frecvent baud vedeți.

Răspuns

De ce oamenii se stabilesc?

Oamenii se stabilesc pentru că este mai mult decât suficient de rapid. Cea mai obișnuită utilizare este doar pentru a imprima câteva lucruri pe un terminal pentru depanare. 9600 baud este de 960 de caractere pe secundă, sau 12 x 80 de caractere pe secundă. Cât de repede poți citi? 🙂

Dacă programul dvs. folosește portul serial pentru transferul de date în bloc, ați alege să nu vă stabiliți.

Ce este limitarea …

Limitele seriale sunt ridicate. În mod direct puteți utiliza 115200 baud în programele dvs. și va funcționa. Terminalul Arduino va permite maxim 115200, dar alte programe precum RealTerm vă vor permite să rulați mai sus.

Serialul hardware va rula la 1 M baud. Dacă citiți în jur, veți vedea că oamenii au folosit până la 1 M controlând direct UART. S-ar putea să beneficiați de rate de transmisie ridicate pentru utilizări precum transmiterea printr-un cip Bluetooth. Dacă utilizați interfața serială hardware pentru a schimba de la cip la cip cu doar o distanță scurtă, atunci 1 M baud este complet fezabil. Gândiți-vă la toate dispozitivele SPI și I2C care funcționează foarte bine la o rată de ceas de 1 MHz.

Pe distanțe mai mari, veți începe să aveți probleme cu zgomotul atunci când utilizați semnalizarea la nivel logic (simplu 0 la 5V). Pentru a utiliza distanțe mai mari, ați adăuga un transceiver pentru a furniza semnalizare robustă, de obicei RS-232 și mai puțin frecvent RS-485. Cu RS-232 puteți rula un mega bit la distanțe de 10 „s de picioare.

Viteza de ceas a microprocesorului va fi adevărata limită. Cu un UART hardware, procesorul trebuie să încarce un octet în UART la fiecare 10 biți (pentru N81). Deci, când ajungeți la 1 M baud, va fi o provocare pentru procesorul de 16 MHz să păstreze UART-ul furnizat cu date. Un nou octet va fi trimis la fiecare 160 de căpușe de ceas, care este foarte puține linii de cod. Pentru o scurtă explozie de date, este posibil să atingeți această rată. Mesajul este că procesorul va rămâne fără viteză înainte ca UART să fie limita.

Notă, toate acestea se aplică pentru HardwareSerial , seria software-ului este foarte diferită.

Comentarii

  • Vă rugăm să rețineți că 2M este arhivabil cu hw serial, dar implementarea arduino ‘ pare prea lentă și trimiteți mult gunoi. Consultați ds-ul atmega328p pentru a găsi bitul magic pentru a vă dubla viteza. De asemenea, adăugați că 9800 baud este un standard foarte vechi și foarte mult de senzori folosesc această valoare ca standard, chiar dacă pot fi configurate pentru mai multe, cum ar fi xbee, gps și multe altele. De asemenea, utilizarea serialului peste USB, negocierea auto-baudrate, care poate suprascrie baudate selectate, dar cred că nu este folosită de arduino (dar poate fi pe Leonardo)
  • 9600 8N1 este, de asemenea, o setare implicită de facto. Multe dispozitive cu interfață serială sunt livrate cu această setare și trebuie configurate dacă este necesară o altă viteză (sau date, bit de paritate, bit de oprire).
  • ” este mai mult decât suficient de rapid ” – Răspuns bun, dar nu sunt de acord cu acest punct. Majoritatea implementărilor de ieșire de depanare se blochează, deci este foarte de dorit să faceți ieșirea de depanare cât mai rapidă pentru a preveni modificări excesive în timpul executării codului.
  • Dacă ‘ faceți transfer de date în bloc, în mod ideal ‘ utilizați SPI, nu?

Răspundeți

În plus față de toate răspunsurile interesante, merită menționat faptul că setarea vitezei seriale la XXX biți / s nu implică în mod necesar XXX biți / s pe hardware.

Ceasurile – chiar și pe bază de cuarț – sunt imperfecte și sunt supuse derivei. În plus, întrucât ceasul serial este de obicei generat printr-o putere de doi pre-divizor și un contor (întreg), toată valoarea nu poate fi obținută cu exactitate având în vedere o frecvență de ceas de bază. Cu ajutorul biților de pornire / oprire, comunicațiile seriale asincrone pot fi tolerante la unele derivații ale ceasului. Dar acest lucru are limite.

De exemplu, dacă ATmega328PA rulează la 1 MHz, puteți atinge 9600b / s la 0,2% din eroare. Dar la 14400b / s eroarea este de -3,5% (comunicând de fapt la 13900b / s). Și la 28800b / s, eroarea este de + 8,5% (comunicând de fapt la 31200b / s).Toate aceste cifre provin din fișa tehnică ATmega48PA-88PA-168PA-328PA, p200 .

Aceasta este nu o problemă atunci când două dispozitive identice comunică împreună (așa cum comunică de fapt cu viteza aceeași ). S-ar putea să fie o problemă atunci când comunicați între diferite dispozitive.

Creșterea frecvenței de bază nu este necesară pentru a îmbunătăți semnificativ precizia. De exemplu, rularea aceluiași ATmega328PA ca mai sus la 2 MHz nu oferă cu adevărat rezultate mai bune, deoarece acestea se datorează în principal erorilor de rotunjire. Dar, rulându-l 1,8432MHz oferă bps foarte exacți de la 2400b / s până la 57,6kHz.

Răspuns

Cred că este un un fel de tradiție de a utiliza o rată de transfer care nu este cea mai lentă (300), dar nici una care ar putea provoca în cele din urmă probleme în unele setări (28800 sau chiar 115200). Portul serial al computerului (cel mai adesea un adaptor USB FTDI232) poate face față unor rate mai mari, dar hardware-ul dvs. DIY nu poate. Deci, 9600 bps s-a stabilit ca un fel de rată de transfer standard pentru exemplele de cod.

Răspuns

Înapoi în negura timpului , „standardul de aur” pentru tastaturi la distanță (folosind un modem de telefon și teletipuri, dacă vă amintiți) a fost de 9600 baud, inițial realizabil numai pe o linie telefonică dedicată. Timpul merge mai încet; tehnologia avansează rapid; iar memoria se mișcă și mai încet decât timpul (se pare). Putem comunica de rutină, cel puțin pe câțiva metri, cu câteva ordine de mărime mai rapide de 9600 baud. Ceea ce a fost considerat cândva un standard de aur nu mai este aur, ci este considerat în continuare standard.

tl; dr: Este istoria, nu tehnologia.

Răspuns

Cred că principalul motiv pentru care oamenii folosesc 9600 de cele mai multe ori este că este rata de transmisie implicită în ID-ul Arduino. De asemenea, viteze mai mari de date ar putea fi, de asemenea, nesigure dacă semnalul serial trebuie să parcurgă un drum lung – deși nu am nici o idee de ce a fost selectat ca viteză optimă.

Timp de reacție umană

Deoarece este capabil să oprească monitorul serial atunci când Arduino dvs. se aruncă pe port este necesar de către utilizatori 100% din timp, iar viteza maximă de transfer este necesară mai mică decât 100% din timp.

9600 baud este un compromis între „procesul de evadare ușor de ucis” și „încetinitor de încet”.

Comentarii

  • 100% hei … interesant;)

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *