Java jSerialPort con Arduino: Las salidas no se imprimen correctamente.
Cuando espero que los resultados sean Hello.
Sospecho que esto tiene que ver con interferencia de threads, así que cambié ComPortTimouts a SerialPort.TIMEOUTREADBLOCKING, sin embargo, no obtengo ningún resultado al hacer esto.
Aquí está mi código Java:
import java.util.Scanner;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
public class Arduino {
private static final SerialPort port = SerialPort.getCommPort(“/dev/cu.usbmodem1101”);
public static void main(String[] args) {
port.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, 0, 0);
if (port.openPort()) {
System.out.println("Puerto abierto");
} else {
System.out.println("Error al abrir el puerto: puede estar en uso o no existir");
}
port.addDataListener(new SerialPortDataListener() {
@Override
public int getListeningEvents() {
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
}
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() == SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
try (Scanner scanner = new Scanner(port.getInputStream())) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
}
}
}
});
port.addDataListener(new SerialPortDataListener() {
@Override
public int getListeningEvents() {
return SerialPort.LISTENING_EVENT_DATA_WRITTEN;
}
@Override
public void serialEvent(SerialPortEvent event) {
if(event.getEventType() == SerialPort.LISTENING_EVENT_DATA_WRITTEN) {
System.out.println("Datos escritos correctamente");
}
}
});
}
}
Y aquí está mi código Arduino:
void setup() {
Serial.begin(9600);
}
void loop() {
while (Serial.available() < 0) {
return;
}
Serial.write("Hello");
delay(1000);
}
davy.ai
Parece que el problema está en la función
Serial.available()
de su código de Arduino. Esta función devuelve el número de bytes disponibles para la lectura del puerto serie, y si es menor que 0, el bucle no se ejecutará. Intente cambiar la condición aSerial.available() > 0
para asegurarse de que se ejecute el bucle.