Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Scopul acestei lucrari este de a prezenta modul de accesare a portului serial si paralel folosind limbajul de programare Java.
Java 2 Standard Edition nu are suport pentru accesarea porturilor seriale. Suportul pentru accesarea porturilor seriale este oferit de SUN prin intermediul pachetului Java Communication API. Prin intermediul acestui pachet programatorul poate accesa porturile seriale si paralele intr-o maniera independenta de platforma. Pentru a putea accesa porturile seriale si paralele pachetul Java Communication trebuie instalat ulterior.
Arhitectura librarii pentru accesarea porturilor seriale si paralele este prezentata in figura 1.
Figura 1. Structura Java Communication API.
In cadrul librariei Communication API sunt definite doua clase principale: clasa SerialPort si clasa ParallelPort. Aceste clase mostenesc clasa CommPort (aceasta este o clasa abstracta) si definesc cele doua tipuri de porturi ce pot fi accesate prin intermediul Communication API.
Constructorii claselor SerialPort si ParallelPort nu sunt publici, astfel incat obtinerea unei instante a acestor clase se realizeaza prin intermediul unor metode statice. Pentru a obtine lista de porturi disponibile se foloseste metoda statica CommPortIdentifier.getPortIdentifiers(). Metoda returneaza o lista de obiecte de tip CommPort ce identifica toate porturile disponibile si care pot fi deschise. Pentru fiecare obiectele de tip CommPort se poate apela metoda open() pentru a deschide respectivul port. De asemenea obiectul poate fi convertit la tipul SerialPort sau ParallelPort in functie de tip de port pe care il reprezinta. Fiecare dintre clasele SerialPort si ParallelPort contin metodele necesare pentru a putea seta parametrii specific fiecarui tip de port.
Java 2 Standard Edition nu include pachetul Java Communication API necesar pentru lucrul cu porturi seriale. Pentru a avea acces la porturile seriale si a putea trimite si citi date pe porturile seriale si paralele (standardele RS323 si IEEE 1284) va trebui sa descacati si sa instalati pachetul Java Communication API.
Versiunea curenta a acestei librarii este 3.0 dar pentru aceasta versiunea nu se ofera suport pentru sistemul de operare Windows. Pentru a putea lucra din Windows va trebui sa instalati versiunea anterioara a acestei librarii - Java Communication API 2.0.
Instructiuni de instalare pentru platforma Windows
S-a notat cu <jdk> calea catre directorul de instalare al J2SE (de exemplu c:javajdk.1.5.0).
Aplicatia prezentata in aceasta sectiune exemplifica modul in care se poate utiliza libraria Communication API pentru a afisa la consola toate porturile seriale si paralele disponibile pe calculator. Dupa cum s-a precizat deja libraria pune la dispozitia programatorului metoda statica CommPortIdentifier.getPortIdentifiers() ce returneaza un obiect de tip Enumeration ce contine lista de porturi disponibile.
import javax.comm.*;
import java.io.*;
import java.util.*;
public class Main
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
Aceasta sectiune prezinta modul in care poate fi deschis un port serial pentru a realiza operatii de scriere si citire.
Pasii necesari pentru a deschide un port serial sunt urmatorii:
package commtest;
import javax.comm.*;
import java.io.*;
public class OpenSerialPort catch (IOException e)
os = new PrintStream(serialPort.getOutputStream(), true);
System.out.println('Ready to do read / write on port '+serialPort.getName());
}
Aceasta sectiune prezinta modul in care poate fi deschis un port serial pentru a realiza operatii de scriere si citire.
Deschiderea portului paralel pentru scriere si citire se face in mod similar ca si in cazul portului serial, doar ca obiectul generic de tip CommPort va trebui convertit la tipul ParallePort pentru a avea acces la metodele specifice portului paralel.
package commtest;
import javax.comm.*;
import java.io.*;
public class OpenParallelPort catch (IOException e)
os = new PrintStream(serialPort.getOutputStream(), true);
System.out.println('Ready to do read / write on port '+serialPort.getName());
}
Operatiile de scriere si citire a porturilor se pot face in doua moduri
Pachetul Communication API permite realizarea de operatii de scriere citire atat in mod sincron cat si in mod asincron.
Comunicarea in mod sincron presupune existenta unui protocol de comunicatie intre aplicatia Java si dispozitivul extern conectat prin portul serial sau paralel in cadrul caruia se cunoaste exact ordinea comenzilor si a raspunsurilor ce sunt schimbate prin intermediul portului deschis. La fiecare comanda transmisa se cunoaste exact ce raspuns trebuie sa soseasca de la dispozitivul conectat. Dupa fiecare comanda transmisa aplicatia asteapta raspunsul de la dispozitivul cu care realizeaza comunicarea.
package commtest;
import javax.comm.*;
import java.io.*;
public class SincronCommunication catch (IOException e)
os = new PrintStream(serialPort.getOutputStream(), true);
System.out.println('Ready to do read / write on port '+serialPort.getName());
}
public void send(String command)
public boolean expect(String expected) throws IOException
public void commProtocol() throws Exception catch (InterruptedException e)
is.close();
os.close();
}
public static void main(String[] args) throws Exception
Comunicarea in mod asincron presupune ca nu se cunoaste exact in avans ordinea in care au loc operatiile de scriere si de citire. In acest caz aplicatia va trebui sa poata sa fie notificata atunci cand apare un eveniment pe portul deshis. Pachetul Communication API ofera posibilitatea comunicatiei in mod asincron folosind pentru aceasta sablonul de proiectare Observer Observable (sau altfel spus modelul orientat pe evenimente). Communication API permite inregistrarea de obiecte de tip Observer (sau Listeners) care sunt notificate in momentul in care un eveniment apare pe portul deschis.
package commtest;
import javax.comm.*;
import java.io.*;
*
* @author mihai
*/
public class AsincronCommunicationEvents extends Thread implements SerialPortEventListener catch (IOException e)
os = new PrintStream(serialPort.getOutputStream(), true);
System.out.println('Ready to do read / write on port '+serialPort.getName());
serialPort.notifyOnDataAvailable(true);
serialPort.addEventListener(this);
}
public void serialEvent(SerialPortEvent event) catch (IOException e)
break;
}
}
public void run() catch (InterruptedException ex)
}
public static void main(String[] args) throws Exception
Atunci cand ordinea in care se produc evenimentele in cadrul unei aplicatii ce foloseste comunicarea prin portul serial nu este cunoscuta pot fi folosite firele de executie (Threads) pentru a gestiona datele ce sunt trimise pe fluxul de iesire si datele ce sunt receptionate pe fluxul de intrare. Detaliile cu privire la construirea si gestionarea firelor de executie sunt acoperite de laboratorul de fire de executie.
Copyright © 2024 - Toate drepturile rezervate