Serial.begin (): Varför inte alltid använda 28800?

I mycket av exempelkoden online lägger folk till raden Serial.begin(9600) i installationsblocket.

När jag letar upp vad Serial.begin() finns på den officiella dokumentationen står det att det styr dataöverföringen av bit per sekund.

Så den uppenbara frågan är, varför inte använda 28800, den högsta överföringshastigheten? Varför nöjer sig människor med 9600? Vad är begränsningen här?

Kommentarer

  • FYI den högsta en arduino som är ansluten till USB-stöd är faktiskt 115200, och 57600 är ofta den näst vanligaste baud ser du.

Svar

Varför gör människor bosätta sig?

Människor bosätter sig eftersom det är mer än tillräckligt snabbt. Den vanligaste användningen är bara att skriva ut några saker på en terminal för debuggin. 9600 baud är 960 tecken per sekund eller 12 x 80 teckenrader per sekund. Hur snabbt kan du läsa? 🙂

Om ditt program använder den seriella porten för massdataöverföring skulle du välja att inte lösa.

Vad är begränsningen …

Gränserna för serie är höga. Direkt kan du använda 115200 baud i dina program och det fungerar bara. Arduino-terminalen tillåter max 115200, men andra program som RealTerm låter dig springa högre.

Hårdvaruserien går till 1 M baud. Om du läser runt ser du att människor har använt upp till 1 M genom att direkt kontrollera UART. Du kan dra nytta av höga baudhastigheter för användning som sändning via ett Bluetooth-chip. Om du använder maskinvarans seriella gränssnitt för att byta från chip till chip med bara ett kort avstånd, är 1 M baud helt genomförbar. Tänk på alla SPI- och I2C-enheter som fungerar bra med 1 MHz klockfrekvens.

På större avstånd kommer du att få problem med brus när du använder logisk nivå (vanlig 0 till 5V) signalering. För att använda större avstånd, skulle du lägga till en sändtagare för att ge robust signalering, vanligtvis RS-232 och mindre vanligt RS-485. Med RS-232 kan du köra en megabit på avstånd på 10 tum fot.

Mikroprocessorns klockhastighet kommer att vara den verkliga gränsen. Med en hårdvaru-UART måste processorn ladda en byte till UART var 10: e bit (för N81). Så när du kommer till 1 M baud blir det en utmaning för 16 MHz-processorn att hålla UART försedd med data. En ny byte skickas var 160: e klockfästning, vilket är väldigt få rader av kod. För en kort serie data kan du uppnå den hastigheten. Meddelandet är att processorn kommer att ta slut hastighet innan UART är gränsen.

Observera att allt detta gäller för HardwareSerial , programserien är väldigt annorlunda.

Kommentarer

  • Observera att 2M kan arkiveras med hw-serier, men arduino ’ s implementering verkar för långsam och skickar mycket skräp. Se atmega328p ds för att hitta den magiska biten för att fördubbla din hastighet. Lägg också till att 9800 baud är en mycket gammal standard och mycket av sensorer använder det värdet som standard, även om det kan konfigureras för mer, som xbee, GPS och mer. Även seriell över USB-användning auto-baudrate-förhandlingshäxa kan åsidosätta valt baudat, men jag tror inte används av arduino (men det kan vara på leonardo)
  • 9600 8N1 är också en de-facto-standardinställning. Många enheter med ett seriellt gränssnitt levereras med denna inställning och måste konfigureras om en annan hastighet (eller databit, paritetsbit, stoppbit) krävs.
  • ” det är mer än tillräckligt snabbt ” – Bra svar, men jag håller inte med om denna punkt. De flesta implementeringar av felsökningsoutput blockerar, så det är mycket önskvärt att göra felsökningsutmatningen så snabbt som möjligt för att förhindra alltför stora förändringar i kodens exekveringstid.
  • Om du ’ gör dataöverföring, helst använder du ’, eller hur?

Svar

Förutom alla intressanta svar är det värt att nämna att det inte är nödvändigt att ställa in seriehastigheten till XXX bitar / s XXX bitar / s på hårdvaran.

Klockor – även kvartsbaserade – är ofullkomliga och utsätts för drift. Eftersom serieklockan vanligtvis genereras genom en power-of-two-fördelare och (heltal) -räknare kan inte heller allt värde erhållas exakt med en basklockfrekvens. Med hjälp av start / stopp-bitarna kan asynkron seriell kommunikation vara tolerant mot viss klockdrift. Men detta har gränser.

Till exempel, om din ATmega328PA körs vid 1MHz kan du uppnå 9600b / s vid 0,2% av felet. Men vid 14400b / s är felet -3,5% (kommunicerar faktiskt vid 13900b / s). Och vid 28800b / s är felet + 8,5% (kommunicerar faktiskt vid 31200b / s).Alla dessa siffror är från ATmega48PA-88PA-168PA-328PA datablad, p200 .

Detta är inte ett problem när två identiska enheter kommunicerar tillsammans (eftersom det faktiskt kommunicerar i samma hastighet ). Det kan vara ett problem när du kommunicerar mellan olika enheter.

Att öka basfrekvensen behöver inte förbättras väsentligt noggrannheten. Till exempel, att köra samma ATmega328PA som ovan vid 2MHz ger egentligen inte bättre resultat eftersom de mest beror på avrundningsfel. Men att köra den 1,8432 MHz ger mycket exakta bps från 2400b / s upp till 57,6 kHz.

Svar

Jag tycker att det är en typ av tradition att använda en överföringshastighet som inte är den långsammaste (300) men inte heller en som så småningom kan orsaka problem i vissa inställningar (28800 eller till och med 115200). PC: ns seriella port (oftast en FTDI232 USB-adapter) klarar högre priser men din DIY-maskinvara kanske inte. Så 9600 bps har etablerat sig som någon form av standardöverföringshastighet för kodexempel.

Svar

Tillbaka i tidens dimmor , ”guldstandarden” för fjärrtangentbord (med hjälp av ett telefonmodem och teletyper, om du kommer ihåg dem) var 9600 baud, initialt uppnådd endast via en dedikerad telefonlinje. Tiden går långsamt; teknologin går snabbt, och minnet rör sig ännu långsammare än tiden (verkar det). Vi kan rutinmässigt kommunicera, åtminstone över flera meter, med ett par storleksordningar snabbare än 9600 baud. Vad som en gång ansågs vara en guldstandard är inte längre guld, men anses fortfarande som standard.

tl; dr: Det är historia, inte teknik.

Svar

Jag tror att den främsta anledningen till att människor använder 9600 för det mesta är att det är standard baudhastighet i Arduino IDE. Snabbare datahastigheter kan också vara opålitliga om den seriella signalen måste färdas långt – även om jag inte har någon aning om varför detta valdes som en optimal hastighet.

Svar

Human Reaction Time

Eftersom att kunna stoppa den seriella bildskärmen när din Arduino slår på porten krävs av användare 100% av tiden, och med maximal överföringshastighet krävs mindre än 100% av tiden.

9600 baud är en kompromiss mellan ”lätt att döda en runaway-process” och ”irriterande långsam”.

Kommentarer

  • 100% hej … intressant;)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *