Soros adatátvitel működése

Az Arduino mikrovezérlőjén van két olyan kivezetés (D0 és D1), amelyeknek megkülönböztetett funkciójuk van. A két kivezetést együtt soros portnak hívjuk. Az egyik kivezetés az adatokat fogadja (Rx – receiver), a másik pedig küldi (Tx – transmitter). A soros átvitel bitenként zajlik, vagyis egy időben egyetlen bit halad át a vezetéken. Ennek megfelelően a kommunikáció sebességét a másodpercenként átvitt bitek számával mérjük. Az Arduino maximális átviteli sebessége 115200 bit másodpercenként.

Az adatok ugyan bitenként, de egymástól jól elhatárolható csomagokban közlekednek. Ezek az adat csomagok START jelből, 8 bit adatból (1 byte) és két STOP jelből állnak, melyeket az adatvezetéken megjelenő feszültség jelképez.
Adó egység működése: Nyugalmi állapotban az adó egység magas jelszintet tart a jelvezetéken. Ez kb 5V feszültséget jelent. Amikor adatokat akar átadni, meghatározott időre 0V-ot kapcsol a jelvezetékre. Ez a start jelzés. Ezt követően meghatározott időközönként 0V és 5V feszültségeket kapcsol a jelvezetékre attól függően, hogy az átadni kívánt byte-nak melyik bitje 0 és melyik 1. Az átvitel a legkisebb helyi értékű bittel kezdődik. Ha az adó végzett mind a nyolc bittel, akkor két időegységnyi stop jelzés következik, hogy a vevő alaphelyzetbe tudjon állni, és ezzel vége a az adott byte átvitelének.

Vevő egység működése: Mivel a vevő egység nem tudja, hogy mikor következik adatok küldése, folyamatosan figyeli az adatvezeték feszültségét. Mindaddig amig 5V-ot talál, addig várakozik. A start bit értelem szerűen egy 0V-os feszültség érték. A vevő ekkor a start bit megjelenését követően meghatározott időközönként megnézi a jelvezeték feszültségét. Ha éppen 0V-ot talál, akkor az LOW, ha 5V körüli értéket, akkor az HIGH. Mivel 8 bitet akarunk átvinni, 8 alkalommal néz a vonalra. Az időpillanatokat a vevő saját maga időzíti, ezért nem árt, ha az adó és a vevő áramkör órája ugyanolyan gyorsan ketyeg. Nagyon fontos, hogy az adás és a vétel sebessége azonos legyen. A nyolc bit vétele után a vevő még egy alkalommal ránéz a vonalra, és ellenőrzi a két időegységnyi stop jelzés meglétét. Ha ekkor alacsony feszültséget talál a vonalon, akkor hiba van. Mivel a jelvezetékek hossza és a környezet zavarjel impulzusai megzavarhatják az adatátvitelt, különböző sebességeket lehet beállítani. Zavarjelekkel terhelt nagyon hosszú jelvezetékeken az átviteli sebesség legyen kicsi (pl. 9600 bit/sec vagy még kisebb), míg rövid vezetékeken lehet a maximum.

Az univerzális aszinkron soros adatküldés és fogadás története a géptávírók koráig nyúlik vissza. Akkoriban nagyon kicsi sebességekkel dolgoztak, úgy emlékszem 110 bit/sec volt a jellemző sebesség. Egy villanymotor által forgatott mechanikus tengelyen elhelyezett érintkezők állították elő a jelsorozatot a leütött billentyű alapján. Az adó és a vevő egység sebességét össze kellett hangolni. Ehhez a forgó tengelyre szerelt korong nyújtott segítséget. A korongra csíkokat festettek, és ha azt egy rezgésbe hozott hangvilla által nyíló és záródó résen át nézték, akkor megfelelő sebességnél a csíkokat állni látták. A villanymotor fordulatszámát addig változtatták, amíg a csíkok álltak. Már csak a vevő és adó egységnél használt hangvilláknak kellett azonosnak lenniük, hogy szinkronban legyenek a szerkezetek. No meg sokat kellett ellenőrizni a villanymotor sebességét. Akkoriban a kicsi átviteli sebesség miatt nem nagyon kellett átviteli hibákkal foglalkozni. Ahogyan nőtt a sebesség, már előfordult, hogy az átvitel során egy-egy bit megsérült, pl. 0 helyett a vevő 1-et olvasott egy zavarimpulzus miatt. Ezért idővel a soros kommunikációban megjelentek az átvitel helyességét ellenőrző megoldások. A nyolc értékes bit mellett még egy 9. bitet is átvittek, ez a paritás bit. Az elv egyszerű, összeadták a nyolc bit értékét, és az eredmény maradéka lett a paritás bit értéke. Vételkor is megismételték a nyolc bit összeadását, és kiszámolták a paritás értékét. Ha ez megegyezett az átküldött paritás értékével, akkor valószínűleg nem sérült az adat.
A paritás bit használta opció, kikapcsolható a használata, mert ez növeli a sebességet.

Az soros átvitel gyűjtőneve UART kommunikáció. Eredetileg bipoláris jelszintekkel történt az átvitel. Pl. az RS-232 szabvány szerint az ‘1’ -12 V és -5 V közötti, a ‘0’ pedig +12 V és +5 V közötti jelszint. A mikrovezérlők és a logikai IC-k világában azonban természetesebb megoldás az unipoláris jelszint alkalmazása: ‘1’ a digitális rendszer logikai  magas jelszintje (+5 V, az egyes eszközöknél +3,3 V), a ‘0’ pedig az alacsony logikai szint (0 V). Tétlen állapotban, amikor nincs adatküldés, az adás vonalat (TX) mindig magas szint.

Egy bit időtartama az adatküldés sebességétől függ. A szabványos adatsebességek: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 bit/s. Pl. A 9600 bit/s azt jelenti, hogy egy bitre 1 s/9600  = 0,00010416667 s, azaz 104,1667 µs idő jut. A start és stop (esetleg paritás) bitek miatt a hasznos adatok továbbítási sebessége kisebb, mint az aktuális adatküldési sebesség. Mivel a mikrovezérlők konkrét és kerek órajel frekvenciákkal dolgoznak (pl. az Arduino Uno 16Mhz), nem feltétlenül egyszerű feladat a pontos bitidők előállítása.

Ha megismerted az UART kommunikáció részletes működését, esetleg érdekelhet az I2C kommunikáció is. Kattints ide, ha igen!

Ha szeretnél gyakorlati példát látni arra, hogyan használhatod a soros portot Arduino programban, akkor kattints ide!

Mennyire volt hasznos amit olvastál?

Kattints egy csillagra az értékeléshez!

Sajnálom, hogy amit olvastál nem volt hasznos számodra!

Szeretném ha elégedett lennél!

Írd le kérlek, hogy mi nem tetszett!?