Vad är Serial.begin (9600)?

Jag vet att detta är för att initialisera något:

Serial.begin(9600); 

Men jag vill vet vad det egentligen betyder?

Kommentarer

Svar

Serial.begin(9600) skriver inte ut någonting. För det vill du använda Serial.print("Hello world!") för att skriva ut texten” Hej världen!” till seriekonsolen. Det initialiserar snarare den seriella anslutningen med 9600 bitar per sekund.

Båda sidorna av den seriella anslutningen (dvs. Arduino och din dator) måste ställas in för att använda samma hastighetsserieanslutning för att få någon sorts av begripliga data. Om det inte finns någon överensstämmelse mellan vad de två systemen tror att hastigheten är då kommer uppgifterna att förväxlas.

9600 bitar per sekund är standard för Arduino och är helt adekvat för de flesta användare, men du kan ändra det till andra hastigheter: Serial.begin(57600) skulle ställa in Arduino för att sända med 57600 bitar per sekund. Du måste ställa in vilken programvara du använder på din dator (som Arduino IDEs seriella bildskärm) till samma hastighet för att se data som skickas.

Kommentarer

  • Baud och BPS är två olika saker … kan ’ inte hitta länken jag letade efter nu.
  • vad händer om jag lägger till ” Seriell .begin (0); ” eller ” Serial.begin (4000); ” . Jag menar att jag vill veta vad som är skillnaden mellan siffrorna?
  • Serial.begin används för att ställa in kommunikationshastigheten i bitar per sekund. En byte är lika med 8 bitar, men seriella anslutningar skickar en start- och stoppbit för att identifiera start och slut för en viss byte till det mottagande systemet. Således behövs 10 bitar för att skicka ett tecken. Med hjälp av Serial.begin(0) berättar Arduino att den ska kommunicera med serie vid 0 bitar per sekund. Som du förväntar dig betyder det att Arduino aldrig kommer att skicka några data alls. Serial.begin(4000) kommer att få Arduino att skicka data med 4000 bitar per sekund. Detta är inte standard, men annars bra.
  • Kort sagt: att ändra numret ändrar hastigheten. Att göra antalet mindre (t.ex. Serial.begin(300)) gör att Arduino skickar data långsammare. Öka det, säg till 57600 kommer att skicka data snabbare. Både det sändande systemet och det mottagande systemet måste komma överens om vilken hastighet som ska användas: din dators ’ seriella program, som Arduino Serial Monitor-fönstret, låter dig ställa in hastigheten med vilken din dator kommer att ta emot data men du kan bara välja bland de vanliga hastigheterna: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 och 11520 bit / sek. Du kan ’ inte ange andra hastigheter, som 4000. 9600 är vanligtvis bra.
  • Baud and BPS are two different things... can't find the link I was looking for now. – Här ’ är en förklaring: Bilaga C: ” baud ” vs. ” bps ”

Svar

En bild är värd 1000 ord, så de säger, (1024 ord om du arbetar med datorer) så jag lägger upp några bilder …

Jag ställde in min Uno för att skicka ”Fab” vid 9600 baud och fångade resultaten på en logisk analysator.

Seriekommandon - 3 bokstäver

Delarna som är skuggade i rött är” ledig ”mellan byte.

Från ovanstående grafiska notering är att Datalinjen Tx (sändning) är normalt hög (1) tills den sjunker lågt för att indikera början på ett tecken (byte). Detta är startbit . Därefter kommer de 8 databitarna (indikerade med vita prickar ) visas med baudhastigheten (9600 prover per sekund). Därefter höjs linjen högt igen. Detta är stoppbiten (den röda delen). Sedan ser vi startbiten för nästa karaktär och så vidare. ”Stopp” -delen kan vara obestämd lång, men den måste vara minst en bitlängd.


Mer information för det första tecknet (bokstaven ”F” eller 0x46 eller 0b01000110) kan vara sett här:

Seriekommandon - en enda byte

  • A – inga data (Tx är högt)

  • B – ”startbiten”. Linjen tas lågt för att berätta för mottagaren att ett tecken (byte) börjar sändas. Mottagaren väntar en och en halv klocka innan han samplar linjen.

  • C – Första tecknet kommer (bokstaven ”F” eller 0x46 eller 0b01000110). Det finns ingen klockbit som sådan, inkommande data samplas helt enkelt med baudhastigheten. I motsats till SPI-kommunikation anländer data minst-signifikant bit först (om du inte skickar 8 bitar per byte). Således ser vi 01100010 (snarare än 01000110).

  • D – Stoppbit. Detta är alltid högt för att säkerställa att vi kan skilja mellan slutet på denna byte och början på nästa. Eftersom startbiten är noll och stoppbiten är en, finns det alltid en tydlig övergång från en byte till en annan.

  • E – Startbiten för nästa tecken.


Du kan se från logikanalysatorns inspelning att T1 - T2 är 0,1041667 ms, och när det händer det vill säga 1/9600:

1 / 9600 = 0.00010416666 seconds 

Således ger hastigheten 9600 dig antalet bitar per sekund och det omvända är tidsintervall mellan bitarna .


Andra överväganden

  • Seriekommandon är inte självklockade (till skillnad från SPI eller I2C och andra), därför måste både avsändare och mottagare komma överens om en klockfrekvens.

  • Klockfrekvensen är inte exakt på Arduino, eftersom hårdvaran måste dela ner systemklockan för att få en seriell klocka, och uppdelningen är inte alltid exakt. Det finns nästan alltid ett fel, mängden anges i databladet (siffror citerade för en 16 MHz systemklocka, som t.ex. på Uno):

    Fel i seriell överföringshastighet

  • Du kan variera antalet databitar, du behöver inte skicka 8 av dem, i själva verket kan du skicka 5 till 9 bitar.

  • Det kan valfritt skickas en paritet bit efter databitarna.

    • Om du anger ”udda” paritet, ställs paritetsbiten på så sätt att det totala antalet 1-bitar är udda.
    • Om du anger ”jämn” paritet är paritetsbiten inställd på ett sådant sätt att det totala antalet 1-bitar är jämnt.
    • Om du inte anger någon paritet utelämnas paritetsbiten.

    Detta kan hjälpa mottagaren att upptäcka om data kom korrekt eller inte.

  • Paritetsbiten skickas före stoppbiten.

  • I fallet med 9 databitar (som används i SeaTalk-protokollet) omfördelas paritetsbiten som en 9: e databit . Därför kan du inte ha både 9 databitar och en paritetsbit.

  • Du kan också ha två stoppbitar. Detta förlänger i princip bara tiden mellan byte. I de ”gamla dagar ”var detta så att långsam elektromekanisk utrustning kunde bearbeta den tidigare byten (t.ex. för att skriva ut den).


Möjlig korruption

Om du börjar lyssna på seriell data mitt i en ström, det är mycket möjligt att en 0-bit i mitten av strömmen tolkas som en startbit, och då kommer mottagaren att tolka allt efter det felaktigt.

Det enda riktiga sättet att återhämta sig från detta är att ha ett tillräckligt stort mellanrum, från tid till annan (t.ex. 10 bitar långa) så att detta inte kan hända.


Inverterad logik

Bitarna som visas här (logiknivå) är inte inverterade. Det vill säga en 1-bit är HÖG och en 0-bit är LÅG. Om du har RS232-utrustning som förmodligen kommer att skicka något som -12 V för en 1-bit och +12 V för en 0-bit. Detta är inverterat eftersom en är mindre an a, noll, spänningsmässigt.

Om du har sådana enheter måste du göra spänningsomvandling och logisk inversion. Chips som MAX232 gör båda åt dig. De kan också tillhandahålla -12 V som behövs för att driva sådan utrustning genom att generera den internt med hjälp av några användarlevererade kondensatorer.


Hastighetsregel

Eftersom vi med en startbit, 8 databitar och en stoppbit har totalt 10 bitar, som en snabb tumregel, kan du beräkna antalet byte du kan sända på en sekund genom att dela bithastigheten med 10.

t.ex. Vid 9600 BPS kan du skicka 960 byte per sekund.


Kod som ska reproduceras:

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

Svar

; TLDR; Den initialiserar den seriella kommunikationsporten och ställer in baudhastigheten. Enheten du kommunicerar med (eller Arduino IDE Serial Monitor) måste ställas in på en matchande baudhastighet. När du har initierat porten kan du börja skicka eller ta emot tecken. Arduino Serial Reference

Kommentarer

  • För att inte minska eller respektera @ Nick- Gammon ’ s utmärkta täckning av detta ämne.

Lämna ett svar

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