2014.06.22.
13:39

Írta: harsanyireka

13. /1) Kommunikációs könyvtárak: SoftwareSerial

Lektorált tananyag, ami a BKF Digitális és Kollaboratív Művészet (DIKOM) pályázatnak keretén belül valósult meg.

Szerző: Harsányi Réka, Társszerző: Juhász Márton András, Lektor: Fernezelyi Márton

Számítástudományban a könyvtár olyan előre megírt kódrészeket jelent, amik meghatározott komplex funkciók elvégzésére képesek. Osztályaik és függvényeik felhasználásával a független programokban nincs szükség ezen feladatok ismételt megoldására. Általánosságban olyan csomagokként értelmezzük őket, amik szolgáltatásként teszik elérhetővé a konfigurációs adatokat, konstansokat és kódokat. Például egy matematikai könyvtár (Arduino esetében a math.h) a programnyelvből közvetlenül nem elérhető függvényeket írja le, mint a tangens, kotangens, logaritmus, gyökvonás.  A rendkívül hasznos függvényeken túl sok esetben bizonyos típusú hardware elemek használatát könnyítik meg – operációs rendszer hiányában ezeket a könyvtárakat felfoghatjuk úgy is, mint eszközillesztő programokat (device driver). Mivel az Arduino egy nyílt forrású, együttműködő közösség által is fejlesztett rendszer, megkülönböztetünk hivatalos és kontribúciós könyvtárakat. Az előbbieket standardként is szokás nevezni, mivel kiforrottságuk miatt a fejlesztőkörnyezet programcsomagjának részét képezik, és olyan általános funkciókat írnak le, amik végrehajtására minden Arduino-típus képes.

 

Könyvtárak szerkezete

Amikor a két fő rutin mellett (setup és loop) szubrutinokat szeretnénk létrehozni, az a void szubrutin_neve() összefüggés segítségével tehető meg:

Arduino kód: 52voiddot

Ha a fenti kódból könyvtárat szeretnénk létrehozni, akkor legalább két fájlra lesz szükségünk, az egyik az úgynevezett fejléc vagy header fájl (kiterjesztése .h), a másik pedig a forrás vagy source fájl (kiterjesztése .cpp). A fejléc definiálja a könyvtárat – minden kifejezésnek szerepelnie kell benne, amire hivatkozni szeretnénk –, míg a forrásfájl tartalmazza a kódot.

A fejléc már a fájl nevében tartalmazza a könyvtárunk nevét (Morse.h):
53morseH

A forrásfájlba már betöltjük a fejlécet, hiszen a definiált osztályt és szubrutinjait töltjük meg tartalommal (Morse.cpp):
54morseCpp

Végül a kész könyvtárunkkal a fenti példakódunk lerövidült és univerzálisabbá vált – használata pedig így néz ki:
55morsekonyvtar

 

A fentiek alapján láthatjuk, hogyan épülnek fel a könyvtárak és hogyan kell őket használni. Akár saját könyvtár készítéséhez is hozzáfoghatunk, azonban mielőtt ezt megtennénk, érdemes kutatómunkát végezni, hiszen mérhetetlenül sokféle funkciót lefed a már létező könyvtárak összessége.

 

SoftwareSerial könyvtár

Az Arduino egyetlen fizikai soros porttal rendelkezik, ami a beépített UART (Universal Asynchronous Receiver Transmitter) terhére mentesíti a feldolgozóegység erőforrásait, amíg a 64 bájtnyi soros átmeneti tárolóban van elég hely. Az integrált port a 0-ás és 1-es digitális csatornákon kommunikál (lásd 9. fejezet), ahol a számítógéphez USB átalakítóval is csatlakozik.

A SoftwareSerial könyvtárat – ahogy a neve is sugallja – azért fejlesztették ki, hogy a feldolgozóegység terhére a többi digitális csatornán is létre lehessen hozni soros kommunikációs felületeket. Segítségével egyszerre kapcsolódhatunk a számítógéphez és más soros eszközökhöz, kijelzőkhöz, digitális szenzorokhoz, vagy kialakíthatunk soros hálózatot több Arduino között. A szoftveres portok maximális sebessége is 115200 baud lehet, ráadásul megváltoztatható a jel polaritása, ami szélesíti a kompatibilis egységek spektrumát, azonban több port létrehozása esetén az adatok egyidejű fogadása nem lehetséges.

Arduino kód: 56softwareserial

A könyvtár függvényei:

  • available()
  • begin()
  • isListening()
  • overflow()
  • peek()
  • read()
  • print()
  • println()
  • listen()
  • write()

 

SoftwareSerial()

Hívásakor létrehoz egy SoftwareSerial objektumot az általunk megadott névvel. Ahhoz, hogy a kommunikációt engedélyezzük, meg kell hívnunk a SoftwareSerial.begin() parancsot is. 

Szintaxisa:

SoftwareSerial(Rx,Tx). 

Paraméterei:

Rx: a szoftveres soros portunk bejövő csatornája,

Tx: a szoftveres soros portunk kimenő csatornája.

Példakód:

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin); 

 

available()

Visszaadja a szoftveres átmeneti tárolóban elérhető, beérkezett bájtok számát. 

Szintaxisa:

mySerial.available(). 

Példakód:

void loop() {
    if (mySerial.available()>0){ // ha már van valami a tárolóban
    mySerial.read(); // olvassuk ki
   }
}

 

begin()

Beállítja a soros kommunikáció sebességét (baud rate). A szabvány átviteli sebességek: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 57600 és 115200.

Szintaxisa:

mySerial.begin(baudrate).

Paramétere:

baudrate: long típusú változó a fenti szabványértékek valamelyike. 

Példakód:

void setup()  {
  // beállítjuk a vevő és adó csatornákat bemenetnek és kimenetnek
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  // meghatározzuk az átviteli sebességet és megnyitjuk a portot
  mySerial.begin(9600);
}

  

isListening()

Megnézhetjük vele, hogy a kiválasztott szoftveres soros port valóban aktív-e. Boole típusú választ ad vissza.

Szintaxisa:

mySerial.isListening(). 

Példakód:

void loop() {
    if (portOne.isListening()) { // ha a port aktív, akkor
       Serial.println("A port aktív!"); 
}

  

overflow()

A szoftveres soros port átmeneti tárolója 64 bájtot képes elraktározni. Amennyiben ezek nem kerülnek időben kiolvasásra, a tároló túlcsordul – a régi adatok helyét nem veszik át az újak és lemaradunk a közölt információ egy részéről. Ezzel a függvénnyel ellenőrizhetjük, hogy történt-e túlcsordulás. Az ellenőrzést követően a függvény válaszát képező Bool változó hamis állapotba kerül.

Szintaxisa:

mySerial.overflow().

Példakód: 

void loop() {
    if (portOne.overflow()) { // ha túlcsordult a tároló, akkor
       Serial.println("A tároló túlcsordult!"); 
}

 

read()

Karakterenként kiolvassa a soros tárolót. 

Szintaxisa:

mySerial.read().

Példakód:

void loop() {
  char c = mySerial.read();
}

 

peek()

Hasonlóan a read()-hez, az utolsó a porton beolvasott karaktert adja vissza, ha nem jött semmi –1-et.

Szintaxisa:

mySerial.peek().

 

print()

Adatokat küld a szoftveres soros port Tx csatornájára. A kiírt bájtok számát adja vissza. 

Arduino kód: 57softwareserial02

 

println()

Ahogy az a fenti példából is látszik, a küldendő adatot automatikusan kiegészíti a „soremelés” kódjával – ugyanúgy, mint azt a hardware-es soros portnál már láttuk.

 

listen()

Több szoftveres soros port használata esetén egyszerre csak egy port kaphatja meg az olvasás jogát. Ezzel a függvénnyel beállíthatjuk, melyik port legyen az, amelyik olvashat. Az összes többi portra érkező adatok elvesznek. 

Szintaxisa:

mySerial.listen().

Arduino kód: 58softwareserial03

 

write()

Az adatokat nyers bájt formátumban küldi ki a portra és visszaadja a kiírt bájtok számát. 

Példakód:

//elküldi a “hello” karaktersort és visszaadja a kiküldött karakterek számát

int bytesSent = mySerial.write(“hello”);

 

- - - - - - - - - -

forrás: http://arduino.cc/en/Tutorial/HomePage

Szólj hozzá!

Címkék: leckék könyvtárak softwareserial lektorált

A bejegyzés trackback címe:

https://harsanyireka.blog.hu/api/trackback/id/tr286398003

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása