Hva er Serial.begin (9600)?

Jeg vet at dette er for å initialisere noe:

Serial.begin(9600); 

Men jeg vil vet hva det egentlig betyr?

Kommentarer

Svar

Serial.begin(9600) skriver ikke ut noe. Til det vil du bruke Serial.print("Hello world!") til å skrive ut teksten» Hei Verden!» til seriekonsollen. Snarere initialiserer den seriell tilkobling til 9600 bits per sekund.

Begge sider av den serielle tilkoblingen (dvs. Arduino og datamaskinen din) må settes til å bruke samme hastighet seriell tilkobling for å få noe slag av forståelige data. Hvis det ikke er et samsvar mellom hva de to systemene tror at hastigheten er, vil dataene bli forvirret.

9600 bits per sekund er standard for Arduino, og er helt tilstrekkelig for de fleste brukere, men du kan endre den til andre hastigheter: Serial.begin(57600) vil sette Arduino til å overføre til 57600 bits per sekund. Du må angi hvilken programvare du bruker på datamaskinen din (som Arduino IDEs serielle skjerm) til samme hastighet for å se dataene som sendes.

Kommentarer

  • Baud og BPS er to forskjellige ting … kan ‘ ikke finne lenken jeg lette etter nå.
  • hva om jeg setter » Serial .begin (0); » eller » Serial.begin (4000); » . Jeg mener jeg vil vite hva som er forskjellen mellom tallene?
  • Serial.begin brukes til å stille kommunikasjonshastigheten, i bits per sekund. Én byte er lik 8 bits, men serielle tilkoblinger sender en start- og stoppbit for å identifisere start og slutt på en bestemt byte til mottakersystemet. Dermed trengs 10 biter for å sende ett tegn. Å bruke Serial.begin(0) forteller Arduino at den skal kommunisere med seriell på 0 bits per sekund. Som du kanskje forventer, betyr dette at Arduino aldri vil sende noen data i det hele tatt. Serial.begin(4000) vil føre til at Arduino sender data med 4000 bits per sekund. Dette er ikke-standard, men ellers greit.
  • Kort sagt: endring av tallet endrer hastigheten. Å gjøre tallet mindre (f.eks. Serial.begin(300)) har Arduino sendt data saktere. Å øke det, si til 57600, vil sende data raskere. Både sendesystemet og mottakersystemet må bli enige om hvilken hastighet du skal bruke: datamaskinen ‘ s serielle program, som Arduino Serial Monitor-vinduet, lar deg stille hastigheten som datamaskinen din vil motta data, men du kan bare velge blant de vanlige hastighetene: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 og 11520 bit / sek. Du kan ‘ ikke angi andre hastigheter, som 4000. 9600 er vanligvis bra.
  • Baud and BPS are two different things... can't find the link I was looking for now. – Her ‘ er en forklaring: Vedlegg C: » baud » vs. » bps »

Svar

Et bilde er verdt 1000 ord, så de sier, (1024 ord hvis du jobber med datamaskiner) så jeg legger ut noen bilder …

Jeg satte opp Uno-en min for å sende «Fab» ved 9600 baud og fanget resultatene på en logisk analysator.

Seriekommandoer - 3 bokstaver

Delene skyggelagt med rødt er» inaktiv «perioden mellom byte.

Fra ovenstående grafiske merknad at Tx (send) datalinje er normalt høy (1) til den faller lavt for å indikere starten på et tegn (byte). Dette er startbit . Deretter de 8 databitene (indikert med hvite prikker ) vises med overføringshastighet (9600 prøver per sekund). Etter det blir linjen høy igjen. Dette er stoppbiten (den røde delen). Så ser vi startbit for neste karakter, og så videre. «Stopp» -delen kan være ubestemt lang, men den må være minst en bitlengde.


Flere detaljer for det første tegnet (bokstaven «F» eller 0x46 eller 0b01000110) kan være sett her:

Seriekommandoer - en enkelt byte

  • A – ingen data (Tx er høy)

  • B – «startbit». Linjen blir tatt lavt for å fortelle mottakeren at et tegn (byte) begynner å bli sendt. Mottakeren venter en og en halv klokkeslett før han sampler linjen.

  • C – Første tegn kommer (bokstaven «F» eller 0x46 eller 0b01000110). Det er ingen klokkebit som sådan, innkommende data samples ganske enkelt med baud (overførings) hastighet. I motsetning til SPI-kommunikasjon kommer dataene minst-vesentlig bit først (i tilfelle du ikke sender 8 bits per byte). Dermed ser vi 01100010 (i stedet for 01000110).

  • D – Stoppbiten. Dette er alltid høyt for å sikre at vi kan skille mellom slutten på denne byten og starten på den neste. Siden startbiten er null, og stoppbiten er en, er det alltid en klar overgang fra en byte til den neste.

  • E – Startbiten for neste tegn.


Fra logikkanalysatoren kan du se at T1 - T2 er 0,1041667 ms, og når det skjer det vil si 1/9600:

1 / 9600 = 0.00010416666 seconds 

Dermed gir hastigheten på 9600 deg antall bits per sekund og det omvendte er tidsintervallet mellom bitene .


Andre betraktninger

  • Seriekommandoer er ikke selvklokket (i motsetning til SPI eller I2C, og andre), derfor må både avsender og mottaker avtale en klokkefrekvens.

  • Klokkefrekvensen er ikke nøyaktig på Arduino, fordi maskinvaren må dele systemklokken ned for å få en seriell klokke, og delingen er ikke alltid nøyaktig. Det er nesten alltid en feil, beløpet er gitt i databladet (tall sitert for en 16 MHz systemklokke, for eksempel på Uno):

    Feil i seriell overføringshastighet

  • Du kan variere antall databiter, du trenger ikke å sende 8 av dem, faktisk kan du sende 5 til 9 bits.

  • Det kan eventuelt sendes en paritet bit etter databitene.

    • Hvis du spesifiserer «odd» paritet, settes paritetsbiten på en slik måte at det totale antallet 1-bits er merkelig.
    • Hvis du spesifiserer «jevn» paritet , er paritetsbiten satt på en slik måte at det totale antallet 1-bits er jevnt.
    • Hvis du ikke angir noen paritet, utelates paritetsbiten.

    Dette kan hjelpe mottakeren med å oppdage om dataene kom riktig eller ikke.

  • Paritetsbiten sendes før stoppbiten.

  • Når det gjelder 9 databiter (som brukt i SeaTalk-protokollen), blir paritetsbiten omdefinert til en 9. databit . Derfor kan du ikke ha både 9 databiter og en paritetsbit.

  • Du kan også ha to stoppbiter. Dette forlenger i utgangspunktet bare tiden mellom byte. I «olden dager «var dette slik at langsomt elektromekanisk utstyr kunne behandle forrige byte (f.eks. for å skrive det ut).


Mulig korrupsjon

Hvis du begynner å lytte til seriell data midt i en strøm, det er fullt mulig at en 0-bit midt i strømmen blir tolket som en startbit, og så vil mottakeren tolke alt etter det feil.

Den eneste virkelige måten å komme seg fra dette er å ha et stort nok gap, fra tid til annen (f.eks. 10 bits langt) til at dette ikke kan skje.


Invertert logikk

Bittene som vises her (logisk nivå) er ikke invertert. Det vil si at en 1-bit er HØY og en 0-bit er LAV. Hvis du har RS232-utstyr som sannsynligvis vil sende noe som -12 V for en 1-bit, og +12 V for en 0-bit. Dette er invertert fordi en er mindre en null, spenningsmessig.

Hvis du har slike enheter, må du gjøre spenningskonvertering og logisk inversjon. Sjetonger som MAX232 vil gjøre begge deler for deg. De kan også gi -12 V som trengs for å kjøre slikt utstyr ved å generere det internt ved hjelp av noen få brukertilførte kondensatorer.


Tommelfingerregel

Siden vi med en startbit, 8 databiter og en stoppbit totalt har 10 bits, kan du som en rask tommelfingerregel beregne antall byte du kan overføre i et sekund ved å dele bithastigheten med 10.

F.eks. Ved 9600 BPS kan du sende 960 byte per sekund.


Kode for å reprodusere:

 void setup() { Serial.begin(9600); Serial.print("Fab"); } void loop () { }  

Svar

; TLDR; Den initialiserer den serielle kommunikasjonsporten og setter overføringshastigheten. Enheten du kommuniserer med (eller Arduino IDE Serial Monitor) må settes til en samsvarende baudrate. Når du har initialisert porten, kan du begynne å sende eller motta tegn. Arduino seriell referanse

Kommentarer

  • For ikke å redusere eller respektere @ Nick- Gammon ‘ utmerket dekning av dette emnet.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *