Hvad er Serial.begin (9600)?

Jeg ved, at dette er for at initialisere noget:

Serial.begin(9600); 

Men jeg vil gerne ved hvad det virkelig betyder?

Kommentarer

Svar

Serial.begin(9600) udskriver faktisk ikke noget. Til det vil du bruge Serial.print("Hello world!") til at udskrive teksten” Hej Verden!” til seriekonsollen. Det initialiserer snarere den serielle forbindelse med 9600 bits pr. Sekund.

Begge sider af den serielle forbindelse (dvs. Arduino og din computer) skal indstilles til at bruge den samme hastighed serielle forbindelse for at få nogen slags af forståelige data. Hvis der er en uoverensstemmelse mellem, hvad de to systemer tror, at hastigheden er, vil dataene blive forvansket.

9600 bits pr. Sekund er standard for Arduino og er helt passende for de fleste brugere, men du kunne ændre det til andre hastigheder: Serial.begin(57600) ville indstille Arduino til at transmittere med 57600 bits pr. sekund. Du skal indstille den software, du bruger på din computer (som Arduino IDEs serielle skærm) til samme hastighed for at se de data, der sendes.

Kommentarer

  • Baud og BPS er to forskellige ting … kan ‘ ikke finde det link, jeg ledte efter nu.
  • hvad hvis jeg sætter ” Seriel .begin (0); ” eller ” Serial.begin (4000); ” . Jeg mener, jeg vil vide, hvad er forskellen mellem tallene?
  • Serial.begin bruges til at indstille kommunikationshastigheden i bits pr. Sekund. En byte er lig med 8 bit, men serielle forbindelser sender en start- og stopbit for at identificere starten og slutningen af en bestemt byte til det modtagende system. Således er der brug for 10 bits for at sende et tegn. Brug af Serial.begin(0) fortæller Arduino, at den skal kommunikere med seriel med 0 bits pr. Sekund. Som du måske forventer, betyder det, at Arduino aldrig vil sende nogen data. Serial.begin(4000) får Arduino til at sende data med 4000 bits pr. sekund. Dette er ikke-standard, men ellers fint.
  • Kort sagt: ændring af antallet ændrer hastigheden. At gøre antallet mindre (f.eks. Serial.begin(300)) har Arduino sendt data langsommere. Hvis du øger det, siger til 57600, sendes data hurtigere. Både sendesystemet og det modtagende system skal være enige om, hvilken hastighed der skal bruges: din computer ‘ serielle program, som Arduino Serial Monitor-vinduet, giver dig mulighed for at indstille den hastighed, hvormed din computer modtager data, men du kan kun vælge mellem de almindelige hastigheder: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 og 11520 bit / sek. Du kan ‘ ikke indtaste andre hastigheder, som 4000. 9600 er normalt godt.
  • Baud and BPS are two different things... can't find the link I was looking for now. – Her ‘ er en forklaring: Appendiks C: ” baud ” vs. ” bps ”

Svar

Et billede er 1000 ord værd, så de siger, (1024 ord, hvis du arbejder med computere), så jeg sender nogle billeder …

Jeg oprettede min Uno til at sende “Fab” ved 9600 baud og fangede resultaterne på en logisk analysator.

Seriekommandoer - 3 bogstaver

De dele, der er skygget med rødt, er den” inaktive “periode mellem byte.

Fra ovenstående grafiske bemærkning, at Tx (send) datalinje er normalt høj (1), indtil den falder lavt for at indikere starten på et tegn (byte). Dette er startbit . Derefter er de 8 databit (angivet med hvide prikker ) vises med baudhastigheden (9600 prøver pr. sekund). Derefter bringes linjen højt igen. Dette er stopbit (den røde del). Så ser vi startbiten for det næste tegn osv. “Stop” -delen kan være ubestemt lang, men den skal være mindst en bitlængde.


Flere detaljer for det første tegn (bogstavet “F” eller 0x46 eller 0b01000110) kan være set her:

Seriekommandoer - en enkelt byte

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

  • B – “startbiten”. Linjen tages lavt for at fortælle modtageren, at et tegn (byte) begynder at blive sendt. Modtageren venter et og et halvt ur, inden han sampler linjen.

  • C – Første tegn ankommer (bogstavet “F” eller 0x46 eller 0b01000110). Der er ingen urbit som sådan, de indgående data samples simpelthen ved baud (transmission). I modsætning til SPI-kommunikation ankommer dataene mindst-signifikant bit først (hvis du ikke sender 8 bit pr. Byte). Således ser vi 01100010 (snarere end 01000110).

  • D – Stopbit. Dette er altid højt for at sikre, at vi kan skelne mellem slutningen af denne byte og starten på den næste. Da startbiten er nul, og stopbiten er en, er der altid en klar overgang fra en byte til den næste.

  • E – Startbiten for næste tegn.


Du kan se fra logikanalysatorens capture, at T1 - T2 er 0,1041667 ms, og som det sker det vil sige 1/9600:

1 / 9600 = 0.00010416666 seconds 

Således giver hastigheden på 9600 dig antallet af bits pr. sekund og det omvendte er tidsinterval mellem bits .


Andre overvejelser

  • Serielle kommandoer er ikke selvklokket (i modsætning til SPI eller I2C og andre), hvorfor både afsender og modtager skal være enige om en urthastighed.

  • Urfrekvensen er ikke nøjagtig på Arduino, fordi hardwaren skal dele systemuret ned for at få et serielt ur, og delingen er ikke altid nøjagtig. Der er næsten altid en fejl, beløbet er angivet i databladet (tal citeret for et 16 MHz systemur, f.eks. På Uno):

    Fejl i seriel baudhastighed

  • Du kan variere antallet af databits, du behøver ikke sende 8 af dem, faktisk kan du sende 5 til 9 bit.

  • Der kan eventuelt sendes en paritet bit efter databitarne.

    • Hvis du angiver “ulige” paritet, indstilles paritetsbiten på en sådan måde, at det samlede antal 1-bits er ulige.
    • Hvis du angiver “lige” paritet , paritetsbiten er indstillet på en sådan måde, at det samlede antal 1-bits er jævnt.
    • Hvis du ikke angiver nogen paritet, udelades paritetsbiten.

    Dette kan hjælpe modtageren med at opdage, om dataene ankom korrekt eller ej.

  • Paritetsbiten sendes inden stopbitten.

  • I tilfælde af 9 databits (som brugt i SeaTalk-protokollen) er paritetsbiten omdirigeret til en 9. databit . Derfor kan du ikke have både 9 databits og en paritetsbit.

  • Du kan også have to stopbits. Dette forlænger stort set bare tiden mellem byte. I de “gamle dage “var dette, så langsomt elektromekanisk udstyr kunne behandle den forrige byte (f.eks. for at udskrive det).


Mulig korruption

Hvis du begynder at lytte til serielle data midt i en strøm, det er meget muligt, at en 0-bit midt i strømmen vil blive fortolket som en startbit, og så fortolker modtageren alt efter det forkert.

Den eneste rigtige måde at komme sig fra dette er at have et stort mellemrum fra tid til anden (f.eks. 10 bits langt) til at dette ikke kan ske.


Omvendt logik

Bitene, der vises her (logisk niveau), er ikke inverterede. Det vil sige, en 1-bit er HØJ og en 0-bit er LAV. Hvis du har RS232-udstyr, der sandsynligvis sender noget som -12 V for en 1-bit og +12 V for en 0-bit. Dette er inverteret, fordi en er mindre et nul, spændingsmæssigt.

Hvis du har sådanne enheder, skal du udføre spændingskonvertering og logisk inversion. Chips som MAX232 vil begge dele for dig. De kan også levere den -12 V, der er nødvendig for at drive sådant udstyr, ved at generere det internt ved hjælp af et par brugerleverede kondensatorer.


Hastighedsregel

Da vi med en startbit, 8 databits og en stopbit i alt har 10 bit, som en hurtig tommelfingerregel kan du beregne antallet af bytes kan du sende i et sekund ved at dividere bithastigheden med 10.

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


Kode, der skal gengives:

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

Svar

; TLDR; Den initialiserer den serielle kommunikationsport og indstiller baudhastigheden. Enheden, som du kommunikerer med (eller Arduino IDE Serial Monitor), skal indstilles til en matchende baudrate. Når du først har initialiseret porten, kan du begynde at sende eller modtage tegn. Arduino seriel reference

Kommentarer

  • For ikke at mindske eller respektere @ Nick- Gammon ‘ er fremragende dækning af dette emne.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *