Sarjaliikennestandardeja on olemassa suuri joukko erilaisia ja varhain keksitty sarjaliikenne on itse asiassa morse-koodi. Peräkkäin lähetetyt piippaukset taikka valon välähdykset, joiden pituus vaihtelee, merkitsevät kukin ennalta sovittua kirjainta ja numeroa tai muuta kirjoitusmerkkiä.
Tietoliikenteen sarjamuotoisissa standardeissa on periaatteessa kyse samasta asiasta, ainoastaan tulkintatapa (protokolla) ja muut fyysiset asiat kuten jännitetasot, ajoitukset, lähetysten pituudet ja mekaaniset/fyysiset rajapinnat vaihtelevat.
Mitä sarjaliikenne on?
Yksinkertaisesti voimme kai todeta, että sarjaliikenne on kuin bittien jono, missä bitit "marssivat" laitteesta sisään ja laitteesta ulos, kuitenkin eri porteista (IO-linjoista). Tietoa lähettävä laite siirtää tiedon ulos laitteen TX-pinnistä (voi olla nimetty myös TxD) ja vastaanottava laite saa tiedon RX-pinniin (voi olla nimetty myös RxD). Ylläolevan kuvan tapauksessa Launchpad (oikealla) lähettää tietoa PC:lle TX-pinnistä ja PC vastaanottaa tiedon RX-pinniin. Alempi bittisarja on tietokoneen TX-pinnistä lähettämä ja Launchpad vastaanottaa sen RX-pinniin. Kuvan nuolet on siis piirretty Launchpadin näkökulmasta ja tietokoneen näkökulmasta ne olisivat luonnollisesti päinvastoin.
Yksisuuntaiseen sarjaliikenteeseen tarvitaan siis vähimmillään yksi IO-lähtö tai tulo ja johdinta missä tieto liikkuu kutsutaan väyläksi tai kanavaksi. Kun tieto liikkuu vain yhteen suuntaan kerrallaan, niin käytetään nimitystä vuorosuuntainen tai half duplex.Kun tieto siirtyy molempiin suuntiin yhtäaikaa, käytetään nimitystä kaksisuuntainen taifull duplex.
Sarjaliikenteen olennaisin asia on se, että tieto saadaan siirtymään paikasta toiseen. Asia ei kuitenkaan aivan näin suoraviivaista ole. Ajatellaanpa vaikka ylläolevan kuvan tapausta, missä tietokone ja sulautettu mikrokontrolleriohjattu laite on kiinnitetty "sarjanarulla" toisiinsa.
Vaikka toinen laitteista olisi aina valmis vastaanottamaan tai lähettämään tietoa, pitää kyseisen laitteen kuitenkin tietää, milloin varsinainen data alkaa ja milloin se loppuu. Tätä varten on olemassa kehys (engl. frame), minkä sisään tieto laitetaan.
Asiaa voi ajatella hieman samaan tapaan kuin sähköpostin kirjoittamistakin. Alkuun yleensä (jos fiksuja ollaan) kirjoitetaan jokin tervehdys, vaikkapa 'Hei'. Tervehdyksen jälkeen kirjoitetaan viesti eli data ja lopuksi päätetään viesti kirjoittamalla vaikkapa 'Vastausta odottaen'. Näin on nyt sähköpostiviestikin saanut varsinaisen viestin ympärille kehyksen, mistä voidaan päätellä milloin viesti on alkanut ja milloin loppunut. Varsinaisen datan eli viestin kannaltahan näillä tervehdyksillä ja hyvästeillä ei ole merkitystä, mutta kokonaisuuden kannalta kyseessä on olennainen asia.
Lyhyesti tiivistettynä sarjaliikenteestä voinee painaa mieleen seuraavat asiat:
- Sarjaliikenteessä bitit liikkuvat yhtä johdinta pitkin laitteiden välillä yhteen suuntaan
- Sarjaliikenteessä tieto on yleensä kehystetty ja se sisältää informaation tiedon alkamisesta ja loppumisesta
- Sarjaliikenteen pituus vaihtelee käytettävän standardin ja protokollan mukaan
- Sarjaliikenne on yleensä halvempi toteuttaa, koska tarvitaan vähäinen määrä ulkoisia IO-linjoja
- Sarjaliikennettä on joka puolella 😉
UART ja USART
Bittien siirtämisen mahdollistaa käytettävä vastaanotin-lähetin (engl. transceiver), joka hoitaa bittien jännitetason tulkinnan ja siirtää vastaanotetut bitit mikrokontrollerin rekistereihin tai tietokoneen muistiin varatulle paikalle. Vastaanotin-lähetin myös muuntaa jännitetasot mikroprosessorin logiikalle sopivaksi, joten ilman vastaanotin-lähetintä ei mikroprosessoria saa kytkeä sarjaliikenneväylään, ellei ole 100 %:sen varma siitä, että jännitetasot ovat samat kaikissa laitteissa.
Tällaisesta vastaanotin-lähettimestä käytetään myös nimeä UART (tai USART), jonka nimi muodostuu englannin kielen sanoista Universal Asynchronous Receiver Transmitter, joka suomennettuna kuuluu: Universaali Asynkroninen Lähetin-Vastaanotin. Tästä suomennoksesta ei kuitenkaan käytetä lyhennettä UALV, sillä tietotekniikassa on selvempää käyttää englanninkielisiä termejä - ovathan ne universaaleja ymmärrettäviä. Jos suomenkielistä termiä haluaa käyttää, niin sarjaportti lienee kaikista selvin ilmaisu tähän asiaan - tai sitten karjaisee rohkeasti vain UART!
Samaan tapaan kuin UART, USART:in lyhenne tulee sanoista Universal Synchronous Asynchronous Receiver Transmitter. Tämä eroaa edeltäjäänsä vain sen verran, että kyseinen vastaanotin-lähetin voidaan asettaa toimimaan sekä asynkronisesti että synkronisesti. Mutta mitä pirua nämä asynkroniset ja synkroniset nyt sitten tarkoittavat? Otetaanpa selvää.
Asynkroninen tiedonsiirto (UART)
Edelleen yksinkertaisesti ilmaistuna asynkroninen tarkoittaa sitä, että tiedon lähetys tai vastaanotto voi tapahtua minä hetkenä hyvänsä. Tiedon kulkua ei siis ilmaise ennalta mikään varoittava tapahtuma. Esimerkiksi ihminen voi minä hetkenä hyvänsä kirjoittaa tietokoneelle komennon, joka lähettää tietoa sarjaportin läpi sulautetulle laitteelle ja laitteen pitää olla valmis "silmänräpäyksessä" vastaanottamaan ja käsittelemään saadun tiedon.
Asynkronisessa tiedon siirrossa on kuitenkin omat ongelmansa, jotka johtuvat juurikin eri laitteiden välisten kellosignaalien eroista. Koska on tähtitieteellisen pieni mahdollisuus, että laitteet toimivat juuri samalla kellotaajuudella, on siten hyvin pieni todennäköisyys sille että lähetettyjä bittejä tulkittaisiin juuri samoilla kellojaksoilla kahdessa tai useammassa eri laitteessa. Selvennettäköön vielä, että laitteet lukevat tietoa datalinjoilta CPU:n (tai UART/USART -moduulin) kellon nousevilla tai laskevilla reunoilla, jotka määräävät milloin datalinjalta bitit luetaan.
"Epätahdikkaista" kelloista johtuen, käytettäessä asynkronista tiedonsiirtoa pitää sekä vastaanottavan että lähettävän pään toimia samaan tahtiin ja samalla nopeudella. Tämän vuoksi ohjelmoijan tulee tietää nopeus, millä laitteet kommunikoivat keskenään - puhutaan baudinopeudesta, mutta siitä lisää hieman alempana.
Synkroninen tiedonsiirto (USART)
Kun kyseessä on synkroninen tiedon lähetys tai vastaanotto, eli hieman päinvastaisempi tapa kuin asynkroninen, niin laite asettuu tiedon vastaanottotilaan esimerkiksi porttipinnin keskeytyksestä, joka ilmaisisi että sarjaportista on kohta bittejä tulossa (ei välttämättä sarjaporttikäytössä, mutta muissa tämä on mahdollista). Lisäksi portista olisi saatavilla kellosignaali, joka pitäisi bitit oikeassa "kohdassa" ja näin ollen kertoisi vastaanottavalle päälle millä taajuudella ja milloin signaalista pitäisi bitti lukea.
Synkronisessa tiedonsiirrossa on se hyvä puoli, että datan kellotaajuus voidaan vastaanottavassa päässä (kumpi laite ikinä ensin lähettääkään) ohjelmallisesti tai raudan avulla selvittää ja data voidaan tulkita oikeaksi nopeammin ja luotettavammin. Toisaalta TX ja RX -linjojen lisäksi tarvitaan kellolinja, ja mahdollisesti muitakin kättelylinjoja, ja nämä vaativat luonnollisesti enemmän IO-kapasiteettia laitteelta.
Nyt kun tiedämme mitä sarjaliikenne suurinpiirtein on ja pakollinen lyhyt kurssi termejä ja käsitteitä on saatu toivottavasti kunnialla läpi, niin voinemme sekoittaa pakkaa lisää vielä muutamalla termillä ja käsitteellä.
Sarjaliikenneprotokolla
Tiedonsiirtoon tarvitaan muutakin kuin pelkästään UART- tai USART-laite ja joukko lähetettäviä bittejä. Standardit ja protokollat astuvatkin tässä vaiheessa kehiin. Protokollat toimivat ikään kuin erotuomarin tapaan, ja kertovat osanottajille mitkä ovat pelin säännöt. Standardi määrittelee muut asiat, kuten bittien ajoitukset ja tiedonsiirtonopeudet sekä jännitetasot ja liittimet.
Erilaisia sarjamuotoisia standardeja on maailma pullollaan (no ei ehkä ihan, mutta ihmisen sormilla niitä kaikkia ei pysty laskemaan) ja tarpeen vaatiessa jokainen voi periaatteessa sellaisen itsekin keksiä taikka määritellä. Ei lähdetä sellaista nyt kuitenkaan miettimään, vaan tutustutaan yleiseen olemassa olevaan ja tämän kirjoituksen kannalta olennaiseen standardiin nimeltä RS232.
RS232 - sarjaportti
RS232:n nimi tulee sanoista Recommended Standard 232, ja nykypäivänä standardilla on ikää lähes yhtä paljon kuin tietotekniikalla muutenkin (no okei, on tämä nyt muutaman vuosikymmenen nuorempi asia). RS232 tunnetaan nykyisin myös sarjaportin (COM tai 'Serial port') nimellä. Sarjaporttiliittimiä joiden läpi tieto kulkee, ei enää uusista tietokoneista löydy, mutta jos omistaa vanhempaa kalustoa, niin tietokoneen takaa voi löytyä sarjaportin liitin. Alla olevassa kuvassa on esitetty D9 sarjaportin liitin. Kuva on lainattu wikipediasta.
Liittimestä voidaan huomata, että siinä on 9 pinniä ja se on D-kirjaimen muotoinen. Tästä syystä liitintä kutsutaan D9-liittimeksi. Pinnien numerointi alkaa 1:stä ja päättyy 9:ään. Pinni numero yksi on liittimen ylärivin vasemmassa nurkassa. Siitä oikealle edeten pinnit numeroidaan 2,3,4 ja 5. Alariviltä löytyvät loput 4 pinniä, alkaen vasemmasta reunasta (6,7,8,9).
Käytön kannalta olennaisimmat pinnit ovat TxD (2), RxD (3) ja GND (5). Muut pinnit on käytössä silloin, jos käytetään erilaisia kättelyitä tai vuonohjauksia. Kättely (engl. Handshake) kertoo vastaanottavalle laitteelle minkälaista dataa laite lähettää ja millä nopeudella.
RS232 sarjaportin jännitteet ja bittien tulkinta
Kuten aiemmin on mainittu ja varmaankin ymmärrät, että bittejä merkataan jännitteillä, jotka ovat jotain maan ja taivaan väliltä (no okei, tavallisesti maan ja käyttöjännitteen välillä). RS232 sarjaportissa jännitteet ovat kuitenkin tyypillisesti noin -12 ja 12 volttia. Sarjaportti toimii kuitenkin (laitteesta riippuen) myös hieman pienemmillä tai suuremmilla jännitteillä, mutta +/- 12 volttia on turvallisesti standardin vaatimien arvojen sisällä.
Alla olevassa kuvassa on esitetty signaalin jännitetasot ja vastaavat bitit (kuva on lainattu tästä osoitteesta):
Kuten kuvasta voidaan heti huomata, niin sarjaportin jännitetasot ovat päinvastaiset bittien suhteen kuin mitä tavanomaisessa logiikassa on totuttu. 1-bittiä vastaa negatiivinen jännite ja 0-bittiä vastaa positiivinen jännite. Lisäksi bittijonon alussa on Start-bitti ja lopussa Stop-bitti. Jos luit aikaisemmat tämän sivun kappaleet, niin ymmärrät että nämä bitit ovat osa kehystä, minkä sisään tieto on laitettu. Start- ja Stop -bitit kertovat milloin data alkaa ja milloin se loppuu. Huomaa myös, että Start- ja Stop-bitit ovat päinvastaiset toisiinsa verrattuna ja että Stop-bitti palaa aina 'Idle' tilaan. 'Idle' -tila on väylän lepotila, eli se jännite mikä väylällä on silloin kun tietoa ei liiku.
Muita kehyksen bittejä on asetuksista riippuen joko yksi tai useampi, vähintään kuitenkin aina yksi (joka on siis stop-bitti). Muita mahdollisia bittejä ovat pariteetti sekä mahdollinen puolikas tai kokonainen toinen stop-bitti. Kokonaisuudessaan sarjaportin lähettämä tai vastaanottama data voi sisältää siis start- ja stop-bitit, databitit sekä pariteettibitin.
RS232-standardissa 1-bittiä nimetään myös englannin kielen sanalla "mark" eli merkki, täppä jne. ja "0"-bittiä kutsutaan "space" eli tyhjä tai väli jne.
Databitit ja pariteetti
Sarjaportin välittämä tieto voi sisältää eri määrän databittejä. Mahdollisia määriä ovat 5,6,7,8 tai 9 databittiä. Näistä kuitenkin 8 databittiä on yleisin, sillä 8 bittiä vastaa yhtä tavua.
Pariteettibitti voi olla kehyksen mukana, tai sitten ei. Jos se on mukana, niin sillä merkitään oliko lähetetyissä biteissä parillinen vai pariton määrä "1"-bittejä, mukaanlukien pariteettibitti itse. Pariteettibitti voi olla asetettu myös kiinteään tilaan joko nollaan tai ykköseen. Jos pariteettibitin asetus on parillinen (engl. even), niin databittien sekä pariteettibitin "1"-bittien lukumäärä on aina tasan. Jos pariteettibitin asetus on pariton (engl. odd), niin "1"-bittien lukumäärä ei koskaan ole tasan - eli jaollinen kahdella.
Kun sarjaportin datasiirron muotoa eli formaattia (notaatio) ilmoitetaan, niin tyypillistä on merkitä databittien lukumäärä, pariteetti ja stop-bittien määrä (Data/Pariteetti/Stop). Esimerkiksi tyypillinen 8 databittiä, ei pariteettia ja yksi stop-bitti merkitään 8N1 tai 8/N/1 (myös 8-N-1). Alla on asian selvennykseksi merkitty muutama erilainen notaatio.
8N1 = 8 databittiä, ei pariteettia, 1 stop-bitti (suosituin)
8-N-2 = 8 databittiä, ei pariteettia, 2 stop-bitti
8/O/1 = 8 databittiä, pariteetti=pariton, 1 stop-bitti
8E1 = 8 databittiä, pariteetti=parillinen, 1 stop-bitti
Datasiirron nopeus - baudinopeus
Bittisarjassa esiintyvien bittien tahtia, eli taajuutta ei ilmaista hertseinä vaan baudeina (symboli Bd). Baudi tarkoittaa sitä, kuinka nopeasti sähköinen signaali sekunnin aikana voi muuttua. Nykyisin puhutaan kuitenkin enemmän biteistä sekunnissa eli bps (engl. bits per second).
Baudinopeus on kääntäen verrannollinen bitin siirtämiseen kulutettuun aikaan. Toisin sanoen, jos datasiirron baudinopeus on 1000, niin yhden bitin siirtämiseen kuluu aikaa 1/1000 sekuntia eli yksi millisekunti.
Tyypillisiä tiedonsiirtonopeuksia, mitä sarjaportin käytössä tarvitsee ovat 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600 ja 115200 bit/s.
Sarjaporttimuuntimet
Kuten on havaittu, niin mikroprosessorin logiikka toimii aina jollakin tietyllä jännitetasolla, joka tyypillisesti on kolmesta viiteen volttia. Koska RS232 -standardissa määritellään, että jännitetasot ovat noin -12 ja +12 volttia, niin on ymmärrettävää ettei näitä jännitteitä voi suoraan kytkeä mikroprosessorin UART/USART moduulin TxD/RxD nastoihin. Tästä syystä tarvitaan sarjaporttimuuntimia, jotka muuntavat RS232-standardin mukaiset jännitteet mikrokontrollerille sopivampaan muotoon.
Esimerkiksi Maximin piiri MAX232 on hyvin suosittu ja laajalle levinnyt sarjaporttimuunnin piiri. Tämän piirin avulla voidaan muuntaa 5 voltin käyttöjännitteellä toimivan prosessorin logiikka RS232-standardin mukaisiksi bittien käyttöjännitteiksi. Alla olevassa kuvassa on esitetty kuinka mikrokontrolleri voidaan liittää MAX232-piirin avulla RS232 sarjaliikenneväylään (kuva on lainattu tästä osoitteesta):
Virtuaalisarjaportti
Virtuaalisarjaportti on kuten tavallinenkin sarjaportti, poikkeuksena on vain se, että virtuaalisarjaportit luodaan USB:n kautta ja että virtuaalisarjaporttipiiriä ei kytketä RS232-väylään. Virtuaalisarjaportti emuloi oikean sarjaportin käyttäytymistä mikrokontrollerin suuntaan ja se näyttäytyy tietokoneelle USB-laitteena.
Esimerkiksi FTDI:n piiri FT232R muuntaa mikrokontrollerilta tulevan sarjamuotoisen dataliikenteen USB:lle sopivaan muotoon, jolloin tietokoneen laitehallinnassa nähdään virtuaalinen sarjaportti.
Lähteitä ja linkkejä:
http://www.wcscnet.com/Tutorials/SerialComm/Page1.htm
http://en.wikipedia.org/wiki/Asynchronous_serial_communication
http://www.docklight.de/manual/index.htm?rs232connectorspinout.htm
http://en.wikipedia.org/wiki/Baud
http://en.wikipedia.org/wiki/Serial_port
http://www.e-yantra.org/vf/discussion/10/ttl-cmos-vs-rs232/p1
http://www.arcelect.com/rs232.htm
http://www.camiresearch.com/Data_Com_Basics/RS232_standard.html