Seriel port
En seriel port er i daglig tale en port der kommunikerer efter RS-232 standarden, men generelt kan de defineres som en port der kommunikerer data efter hinanden i en seriel rækkefølge, typisk én bit ad gangen. På den måde kan en netværks port faktisk også defineres som en seriel port.
Denne artikel vil kun behandle den typiske serielle forbindelse der arbejder som asynkron kommunikation.
Asynkron kommunikation på 5V signaler
Når man kommunikerer serielt skal både afsender og modtager være enige om hvilken hastighed der kommunikeres med. Det defineres i bit pr. sekund, eller normalt betegnet som BAUD (udtales BO).
Man skal desuden være enige om hvordan de enkelte bit kommer efter hinanden, hvornår de starter og hvor meget der kommer.
I en normal asynkron transmission sender man normalt en byte på 8 bit, og det bliver "pakket ind" i start og stopbit som vist her:
- Når der ikke sendes, så er linjen høj
- Det er fast at der sendes 1 startbit - den er lavt niveau, så man kan se der kommer noget.
- Herefter kommer et antal databit, typisk 8 bit, men det kan indstilles til at være fra 5 til 8 bit.
- Som den sidste del af data kan der komme en ekstra bit der indeholder paritet. Hvis der er lige paritet, så sendes enten høj eller lav, så der er et lige antal høje databit (incl. pariteten), og hvis det er ulige paritet sendes der så der er et ulige antal høje databit med pariteten. Ud fra pariteten kan modtageren kontrollere om det modtagne har korrekt paritet, og hvis det ikke har, kan man forkaste det modtagne.
- Til sidst kommer stop-bittene, hvor standard længden er enten 1, 1½ eller 2 stopbit. Dette gør at man igen kan se den korrekte kant på startbitten.
Som figuren viser en byte der er sendt med 8 databit uden paritet. Til start ligger linien på høj, og for at angive starten sendes et nul (Start-bit) herefter sendes de 8 bit med den mindst betydende bit (LSB) først, og til slut en høj stopbit. Byten her har værdien 01001011Bin = 4BHex = 75Dec.
Denne tolkning af bittene kan kun fungere, hvis sender og modtager er enige om hvor lang tid en bit er, altså hvilken hastigehed bittene kommer med. Der angives normalt i bit pr. sekund (betegnes normalt som Baud), og der anvendes følgende standarder:
Baud | Bit-tid | Byte-tid (8 bit, baud og 2 stop) |
---|---|---|
110 | 9,09 ms | 109 ms |
300 | 3,33 ms | 40 ms |
600 | 1,67 ms | 20 ms |
1200 | 0,833 ms | 10 ms |
2400 | 0,417 ms | 5,0 ms |
4800 | 0,208 ms | 2,5 ms |
9600 | 0,104 ms | 1,25 ms |
19200 | 52 us | 625 us |
38400 | 26 us | 312 us |
115200 | 8,68 us | 104 us |
230400 | 4,34 us | 52 us |
Af denne tabel ser man også hvordan sammenhængen mellem Buad-raten og bit-tiden er givet som: Bit-tid = 1/Buad
Software til Arduino
Til Arduinoen ligger der moduler[1] der kan kommunikere med den serielle port.
At få en seriel port på computeren
I "gamle dage" var det standard med en seriel port i PC'en, og normalt vil der også være en enkelt seriel port på en stationær PC i dag, men på en bærbar vil der i dag ikke være serielle porte, så der er man nødt til at gøre noget andet.
USB til RS-232 converter
En simpel måde at få RS-232 på en bærbar i dag er, at man anvender en USB til RS-232 converter, Dette er et lille kabel med en converter indbygget, der kan fungere som en RS-232 port, som den viste her:
Denne model kan have lidt problemer med at finde en driver, men der skulle være mulighed for at finde en på [ denne side].
Andre modeller anvender en kreds der hedder FTDI-232, der kan findes på [ denne side]
Direkte seriel port
Når man skal bruge det til at kommunikere f.x. med en PIC eller en Arduino, så kan det virke lidt dumt og overflødigt at man først konverterer 5V signaler om til RS-232 niveauerne (+/- 15V) vha. ovennævnte adapter for så at konvertere det tilbage til 5V signaler til PIC eller Arduino.
Derfor findes der et lille modul, der kan lave en seriel port ud fra en USB-port, så man får de serielle signaler på 5V-niveauer og kan slutte det direkte til mikrocontrolleren.
Den enhed vi har på HTX Holstebro hedder B75937 (det står på enheden), og den skal have en driver til Windows der hedder CP2102, og man kan finde en Driver til CP2102 her. Til windows 8 har jeg fået Denne driversoftware til at fungere.
Selve enheden ser således ud:
Tilslutning af enheden
Når man skal forbinde enheden til en PIC eller andet, så er der løse ledninger der kan forbindes til den port man vil ind på på PIC'en.
På enheden skal man have forbindelse fra GND på PIC-printet og til GND på enheden. Desuden kan man også forsyne PIC printet med 5V fra adapteren hvis ikke PIC printet er forsynet andetsteds fra.
På enheden er der markeret RxD og TxD. Disse er IKKE RxD og TxD på enheden, men viser at de skal tilsluttes RxD og TxD (RX og TX) på PIC-printet.
OBS!! USB modulet skal ikke have 5 volt forsygning fra PIC-printet. Den får forsygning fra USB, så det eneste der skal kobles til PIC-printet er RxD, TxD og GND.
Software til PC'en
For at kunne kommunikere med PC'en skal der være et program, der kan sende og modtage på den COM-port (seriel port) som man har tilsluttet.
Man kan vælge selv at skrive programmet f.x. i C++ eller C#, hvor man programmerer præcist de funktioner man ønsker.
I Arduino miljøet er der indbygget en Serial Monitor, der kan kommunikere med den serielle port i Arduinoen.
En anden mulighed er at arbejde med et terminal-program, enten et helt generelt program eller f.x. det terminal-program der ligger i JALEdit, som kan findes på denne ikon:
Her får man et terminalbillede op der ser ud som nedenstående, hvor man skal starte med at finde den COM-port man har tilsluttet på Serial Settings, og derefter connecte til til porten på Connect.
Software til PIC
Til PIC skal man være opmærksom på hvilken type PIC man anvender, da det skal implementeres forskelligt i softwaren. Forklaringen ligger i om PIC'en har indbygget UART, eller om softwaren på PIC'en skal analysere det modtagne data bit for bit for at kunne afkode den serielle data.
PIC | UART |
---|---|
PIC12F675 | Software |
PIC16F684 | Software |
PIC16F690 | Hardware |
PIC16F84 | Software |
PIC16F628 | Hardware |
PIC16F877 | Hardware |
I JAL bibliotekerne ligger der software der kan kommunikere med en seriel port på forskellig vis, alt efter hvilken PIC det er, og man er nødt til at vælge softwaren efter hvilken type PIC man har, og hvordan man ønsker at kommunikere.
Hardware UART til PIC
I JAL bibliotekerne ligger der to forskellige typer software der gør det let at interface til hardware-UARTEN inde i PIC'en.
Det ene bibliotek serial_hardware er baseret på at man sender og modtager enkelt karakterer, og at man selv får tjekket om der er kommet en karakter, inden den næste kommer og overskriver den i CPU'ens hardware.
Det andet bibliotek serial_hw_int_cts anvender interruptet til både sending og modtagelse, og det er etableret en buufer, der kan indeholde en del karakterer, så man ikke behøver at servicere modtagelsen så tit, og man kan få lagt en hel streng klar til at sende, uden den skal vente på det bliver sendt. Desuden er der handshake, der kan styre om sender og modtager er klar.
serial_hardware | serial_hw_int_cts | |
---|---|---|
Fordele | Simpelt af anvende, let at sætte op | Kan modtage og sende flere karakterer direkte efter hinanden, uden at programmet skal vente på det |
Ulemper | Kan ikke sende mere end en karakter, inden den skal vente på at næste karakter skal sendes Man skal fange en karakter inden der kommer en mere |
Man skal være opmærksom på at interruptet kan få tid til at blive serviceret Anvender hukommelse til buffer, så det kan beslaglægge meget RAM af PIC'ens begrænsede hukommelse |
Software UART til PIC
I JAL bibliotekerne ligger der også software serial_software der kan lave en software UART inde i PIC'en, men det har den ulempe, at hvis man ønsker at modtage en karakter, så låser softwaren indtil der kommer en karakter.
Der er lavet et software modul, der kan modtage og sende serielt ved hjælp af interrupt, hvor man kan undersøge om der er kommet en karakter, så softwaren ikke låser, hvis der ikke kommer en karakter. Dette modul er lavet i seriel_holst
serial_software | seriel_holst | |
---|---|---|
Fordele | Simpelt af anvende, let at sætte op Kan arbejde med høje Baudrates |
Man kan tjekke om der er modtaget en karakter, før man giver sig til at modtage den Programmet kan fortsætte mens man sender og modtager |
Ulemper | Låser indtil der kommer en karakter - man kan ikke teste om der er kommet en karakter Disabler alt interrupt men der ventes på en karakter og den modtages / sendes |
Belaster CPU'en ret hårdt, specielt under modtagelse af karakterer Kan kun arbejde med begrænsede Baudrates |
Referencer
- ↑ Grundlæggende beskrivelse af Serial biblioteket på arduino.cc