Soros átvitel – küldés-fogadás egyszerre


Eddig tárgyaltuk a pc-re való küldés és fogadás eseteit külön-külön, de mi van abban az esetben ha küldeni és fogadni is szeretnénk egy grafikus felületről adatokat. Persze ez is megoldható, csak egy kicsit hosszabb kód segítségével. Ha küldeni és fogadni is szeretnénk, akkor be kell állítanunk egy prioritási sorrendet, hogy melyik fontosabb, a küldés vagy a fogadás.
Általánosan a pc-ről küldött adatok előnyt szoktak élvezni, hisz egy egység ki-be kapcsolhatóságára nem túl célszerű több mp-t várni. A fogadás a szabadon maradt időközökben történik.

Nézzük az arduiono kódot:

char val;

void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) {
val = Serial.read();
if(val == '1')
{
digitalWrite(13, HIGH);
}
else
digitalWrite(13,LOW);
}
else{
Serial.println("Hello, world!");
delay(100);
}
}



Első lépésben figyeljük a soros átvitelt és ha változik akkor eltároljuk az érkező értéket a val nevű változóba:

if (Serial.available() > 0) {
val = Serial.read();

Ez után beazonosítjuk a változó értékét, ha ez 1 akkor bekapcsolja a beépített ledet, ha nulla akkor ki.
A második else az érdekesebb, itt ha nem történik soros adatátvitel akkor
aktiválódik az else-be foglalt utasítás:

else{
Serial.println("Hello, world!");
delay(100);
}

Ebben az esetben rögtön küld vissza felé a soros kapcsolaton egy „Hello Word!” üzenetet.


A processing kód:
import processing.serial.*;
Serial myPort;
String adat;

void setup() {
size(200, 200);
myPort = new Serial(this,"COM4", 9600);
}

void draw() {
if (mousePressed == true)
{
myPort.write('1');
println("1");
}
else{
myPort.write('0');
while(myPort.available()>0)
adat = myPort.readStringUntil('\n');
if(adat != null)
println(adat);
}
}

A processing kódban első helyen megint a soros port beállítása van, ezt ugye a : myPort = new Serial(this,"COM4", 9600);  sorban tudjuk beállítani. Nekem a COM4-es porton van az arduino alaplapom, de mindenkinek a saját COM portját kell ide beírnia.

A processing figyeli a kirajzolt terület feletti egér gomb lenyomást, ha ilyen történik akkor kiírat a soros portra egy 1-est.

if (mousePressed == true)
{
myPort.write('1');
println("1");

A feltétel else ágában viszont kiírat egy 0 értéket és elkezdi figyelni, hogy nincs-e vissza érkező adat, ha van akkor elmenti azt az adat változóba.

while(myPort.available()>0)
adat = myPort.readStringUntil('\n');

(Persze itt szöveges adatot vár az első sortörésig.)
Az utolsó két sor még leellenőrzi az adat változó tartalmát és ha ez nem nulla akkor kiíratja a konzolunkra.

if(adat != null)
println(adat);

Mint láthatjuk az adott terület feletti egér gomb lenyomást figyeli a programunk, amíg lenyomva tartjuk a gombot az arduino beépített ledje világit. Ha felengedjük a gombot a led elalszik és elkezdenek érkezni az üzenetek a pc-re. Így megvalósul egy egyszerű küldés-fogadás, amit tovább lehet szépítgetni, javítgatni, csomagok készítésével, többszöri átküldéssel a hibák kiküszöbölésére, vagy ép más trükkökkel amik még biztonságosabbá és stabilabbá teszi a soros kommunikációt.