piątek, 23 listopada 2007

Java: Obsługa portu szeregowego (Windows)

Do obsługi komunikacja przez port szeregowy użyję biblioteki RXTXComm. Potrzebne są dwa pliki: jeden to plik RXTXComm.jar, który dołączamy do projektu, drugi to rxtxSerial.dll (biblioteka ta jest tylko dla systemu Windows, ale można wykorzystać dołączoną do rxtxcomm ibrxtxSerial.so), który należy umieścić np. w katalogu głównym aplikacji, która będzie korzystać z biblioteki. Więcej na ten temat można znaleźć na stronie domowej projektu.
Klasa SerialComm jest singletonem odpowiedzialnym za inicjację połączenia. Jeśli uda się otworzyć wybrany port, SerialComm inicjuje dwa strumienie inputStream i outputStream - pierwszy to strumień danych przychodzących z portu, a drugi służy do wysyłania danych poprzez otwarty port. Strumień wejściowy przekazuję do obiektu klasy CommunicationReader, który odczytuje dane wejściowe.
Metoda sendMessage(String msg) wykorzystuje outputStream do wysyłania danych poprzez otwarty port.

public class SerialComm {    
private static SerialComm instance = null;
private Enumeration portList;
private CommPortIdentifier portId;
private SerialPort serialPort = null;
private OutputStream outputStream;
private InputStream inputStream;
private Thread readThread;
private CommunicationReader reader;

private SerialComm() {}

public static synchronized SerialComm getInstance() {
if (instance == null) {
instance = new SerialComm();
}
return instance;
}

/**
* Inicjalizacja portu komunikacyjnego
* Mozliwe zwracane wartosci:
* 0 - podlaczono do portu
* >0 wystapil wyjatek
* @return status polaczenia
*/
private int connect(String portName, int baudrate, int dataBits, int stopBits, int parity) {
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals(portName)) {
try {
serialPort = (SerialPort) portId.open("App", 2000);
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();
serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity);
} catch (UnsupportedCommOperationException e) {
serialPort = null;
return 10;
} catch (PortInUseException e) {
serialPort = null;
return 20;
} catch (IOException e) {
serialPort = null;
return 30;
}
reader = new CommunicationReader(inputStream);
readThread = new Thread(reader, "SerialComm read");
readThread.start();
}
}
}
return 0;
}

public boolean sendMessage(String msg) {
if (portId.getName().length() > 0) {
try {
outputStream.write(msg.getBytes("ISO-8859-1"));
} catch (IOException e) {
return false;
}
}else{
return false;
}
return true;
}
}

Brak komentarzy: