Bien pues para esta tarea existe una librería llamada Java Comunication API. Pero hay que tener en cuenta que para comunicarte a través de algo físico de la máquina Java nos proporciona una fachada de métodos que por debajo se conectan con diferentes drivers según si estamos corriendo el programa en un windows, macos o linux. Esto quiere decir que además de tener la máquina virtual de java instalada tendrás que instalar un driver en el sistema operativo. Yo empece a trabajar con la implementación de Sun pero me dió muchos problemas y no conseguía que me detectara los drivers instalados, así que finalmente opte por usar una implementación de Java Comunication API open source llamada RXTX. Con ella fue todo rodado por lo que os recomiendo que la useís.
Su página web es
http://rxtx.qbang.org/
La instalación es muy simple os bajais la librería en la que os viene:
- RXTXcomm.jar (librería que implementa la especificación de Java Comunication API)
- Directorio con drivers para Linux
- Directorio con drivers para Solaris
- Directorio con drivers para Mac_OS_X
- Directorio con drivers para Windows
Añadis RXTXcomm.jar como librería a vuestro proyecto java y el driver lo meteis en la instalación del jre\bin
Ahora la implementación de una conexión al puerto serie.
public class EjemploRXTX {
static CommPortIdentifier portId;
static CommPortIdentifier saveportId;
static Enumeration portList;
static InputStream inputStream;
static OutputStream outputStream;
static BufferedInputStream bufferedInputStream;
static SerialPort serialPort;
public static void main(String[] args){
boolean gotPort = false;
String port;
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement(); //get next port to check
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if ( portId.getName().equals("COM4") ) {
port = portId.getName();
gotPort = true;
}
if (gotPort == true) {
try {
serialPort = (SerialPort)portId.open("SMSSender", 2000);
} catch (PortInUseException ex) {
ex.printStackTrace();
}
try {
outputStream = serialPort.getOutputStream();
} catch (IOException ex) {
ex.printStackTrace();
}
try {
serialPort.setSerialPortParams(19200,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_2,
SerialPort.PARITY_NONE
);
} catch (UnsupportedCommOperationException ex) {
ex.printStackTrace();
}
try {
inputStream = serialPort.getInputStream();
bufferedInputStream = new BufferedInputStream(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
serialPort.notifyOnDataAvailable(true);
}
}
}
//Escribir en el puerto serie
try {
if (!(outputStream == null))
outputStream.write("array de váis que queremos enviar");
byte[] readBuffer = new byte[1];
boolean read = false;
while(!read) {
try {
String getInfo = "";
Thread.sleep(100);
while (bufferedInputStream.available() > 0) {
int numBytes = bufferedInputStream.read(readBuffer);
getInfo += new String(readBuffer);
read = true;
}
feedback += getInfo;
int length = getInfo.length();
} catch (Exception e){
e.printStackTrace();
}
}
} catch (IOException e){
e.printStackTrace();
}
}
En este ejemplo se usa por debajo una plataforma windows como podéis ver en el nombre del puerto "COM4" en un linux por ejemplo este sería algo como "/dev/ttyS0".
Tambíen para cada caso teneis que tener en cuenta que los datos de conexión con el dispositivo son particulares a cada dispositivo:
serialPort.setSerialPortParams(19200,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_2,
SerialPort.PARITY_NONE
);
El dispositivo de este ejemplo trabajaba a 19200 baudios, tamaño de mensaje 8 bits, sin paridad y con el bit de parada 2.
Si ajustais estas cosas ya os debe funcionar para cualquier dispositivo.