Seriel port

Fra HTX Arduino
(Omdirigeret fra Arduino Seriel)
Spring til navigation Spring til søgning

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:

Asynkron byte.png

  • 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:

Usb232 back.jpg

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:

B75937.jpg

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:

Jaledit-serial.png

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.

Jaledit-terminal.png

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
Venter aktivt under afsendelse af en karakter

Belaster CPU'en ret hårdt, specielt under modtagelse af karakterer

Kan kun arbejde med begrænsede Baudrates
Bruger Timeren TMR0, så den ikke kan anvendes til andet

Referencer

  1. Grundlæggende beskrivelse af Serial biblioteket på arduino.cc
Programmering
Programmeringsbegreber Initialisering - Sekvens - Algoritme - Hexadecimal - Det Binære Talsystem - HEX-fil - ASCII - Interrupt - Events - Styresystem - Autocomplete - Selvstudie Programmering - Hour Of Code - Stepwise Improvement - Syntaks - Prog-links - Microcontroller - ChatGPT
Grundlæggende C C float - C double - C-løkker - Datatyper - Konstanter - Regnearter - Funktioner - Return - Returværdi - Rekursion - Semikolon
Variabel Typer boolean - byte - int - unsigned int - word - long - unsigned long - short - float - double - char - unsigned char - string - char array - String - object - Array - 2-dimensionelt Array - void
Program-klassikere Polling - State-machine - Trykknap - Forkant - Bagkant - Prel
Arduino Arduino til Programmering - C til Arduino - Programmering Shield - Arduino PC-software - Arduino Udviklingsmiljø - Arduino Pin Library - Funktion - Arduino Seriel - Arduino String - Arduino String Split - Arduino StateChangeDetection - setup() - loop() - Compilerdirektiver - Asynkron kommunikation - millis() - micros() - Scratch for Arduino - Send fra Arduino til Excel - [[]] - [[]]
Processing Grafik i Processing‎ - Keyboard i Processing - Mus i Processing‎ - Tid i Processing‎ - Draw() - Setup() - Tal Input til Processing - Syntaksfarvning - Kommunikation fra Arduino til Processing - Kommunikation fra Processing til Arduino
javaScript Javascript input‎ - Javascript output‎ - Javascript strukturer‎ - Javascript syntaks‎ - Tid i javaScript - Objekt‎ - AJAX
Serverprogrammering PHP - MySQL - Task Scheduler - WeMOS
PIC JAL - [[]]
Scratch for Arduino S4A Installation - S4A programmering - S4A undervisningsforløb - S4A begrænsninger
Program Dokumentation Algoritme - Flowchart - Pseudokode - Datastruktur - Dataabstraktion - Pulsplaner - Program-kommentar - Teori - Test - UML


Logik Begreber
Gates AND-gate - OR-gate - NOT-gate - NAND-gate - NOR-gate - XOR-gate - XNOR-gate - Inverter-gate - Schmitt-trigger
Flip-flop RS-flip-flop - D-flip-flop - JK-flip-flop - Latch - Toggle-flip-flop
Sekventiel logik Flip-flop - Multivibrator - Astabil Multivibrator - Monostabil Multivibrator - Digital tæller - Binær counter - BCD-counter - Skifteregister - Bistabil Multivibrator
Logiske grundbegreber Kombinatorisk logik - Binære tal - Hexadecimal - BCD - Talsystemer - Sandhedstabel - Pull-down - Pull-up - 7-segment-display - Binær Adder - Binær comperator - Logisk Dekoder - HEX-fil
Logisk Reduktion Boolesk Algebra - De Morgan - Karnaughkort - Karnaughkort udlæsning - Automatisk reduktion
Hukommelse RAM - ROM - PROM - EPROM - EEPROM
Logik-familier CMOS-logik - TTL-logik
Seriel Kommunikation Arduino Bluetooth - Baud - Handshake - I2C - I2C Adresser - I2C Bus - I2C Generelt - RS-232 - Serial hardware - Serial hw int cts - Serial software - Seriel port - UART
Generelt Digital-bogen - Digitale Input - Konverter - PWM - Schmitt-trigger - Simulering - Pulsplaner