PUERTO SERIAL
Continuando con mi anterior artículo Leer de Arduino, os comentaré como poder "escribir" en arduino, es decir, pasarle información a tu sketch.
Usando como base el código del anterior artículo, puedes incorporar otro método con el que harás el trabajo. En mi caso le paso el intervalo en milisegundos con el que quiero que emita los eventos; así puedo guardar los registros de temperatura.
public synchronized void writeData(int intervalInSeconds) {
def intervalInMilliSeconds = convertToMilliseconds(intervalInSeconds)
try {
outputStream.write(intervalInMilliSeconds.getBytes())
} catch (Exception e) {
LOG.error("Unhandled exception writing to port", e)
}
}
Quedando como resultado algo similar a esto.
package com.mallotore.monitoring.service
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.OutputStream
import gnu.io.CommPortIdentifier
import gnu.io.SerialPort
import gnu.io.SerialPortEvent
import gnu.io.SerialPortEventListener
import java.util.Enumeration
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import com.mallotore.monitoring.repository.TemperatureRepository
import com.mallotore.monitoring.model.Temperature
class TemperatureReader implements SerialPortEventListener {
static Logger LOG = LoggerFactory.getLogger(TemperatureReader.class)
SerialPort serialPort
static final PORT_NAMES = [ "/dev/tty.usbserial-A9007UX1", "/dev/ttyACM0", "/dev/ttyUSB0", "COM3" ]
private BufferedReader inputReader
private OutputStream outputStream
private static final int TIME_OUT = 2000
private static final int DATA_RATE = 9600
private TemperatureRepository temperatureRepository
public TemperatureReader(TemperatureRepository temperatureRepository){
this.temperatureRepository = temperatureRepository
}
public void initialize() {
withPortId(){ portId ->
try {
serialPort = (SerialPort) portId.open(this.getClass().getName(),TIME_OUT);
serialPort.setSerialPortParams(DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE)
inputReader = new BufferedReader(new InputStreamReader(serialPort.getInputStream()))
outputStream = serialPort.getOutputStream()
serialPort.addEventListener(this)
serialPort.notifyOnDataAvailable(true)
} catch (Exception e) {
LOG.error("Unhandled exception initializing serial port listener",e)
}
}
}
private withPortId(Closure closure){
System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0")
def portId = findAvailablePort()
if(portId){
closure(portId)
}
else{
LOG.error("Could not find COM port.")
}
}
private findAvailablePort(){
for(def portName in PORT_NAMES){
def portId = CommPortIdentifier.getPortIdentifiers().find{
it.getName().equals(portName)
}
if(portId) return portId
}
}
public synchronized void close() {
if (serialPort) {
serialPort.removeEventListener()
serialPort.close()
inputReader.close()
outputStream.close()
}
}
public synchronized void writeData(int intervalInSeconds) {
def intervalInMilliSeconds = convertToMilliseconds(intervalInSeconds)
try {
outputStream.write(intervalInMilliSeconds.getBytes())
} catch (Exception e) {
LOG.error("Unhandled exception writing to port", e)
}
}
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
String temperature = inputReader.readLine()
def currentTemperature = Float.parseFloat(temperature)
temperatureRepository.save(new Temperature(temperature:temperature))
} catch (Exception e) {
LOG.error("Unhandled exception on serial port event",e)
}
}
}
}
Con esto ya somos capaces de comunicarnos con arduino tanto para leer como para escribir.