Java jssc-从SerialEvent向另一个类传递值
我正在制作一个使用登录表单并使用串行端口访问Arduino的项目。我必须在应用程序启动时向Arduino发送一个字符串,并等待设备的响应,以便在检查登录用户名和密码是否正确之前知道其已准备好操作。我创建了两个类,一个叫做Login,用于检查用户名和密码,另一个叫做serial,包含jssc实现 我正在使用java simple serial connector库和找到的示例 这个函数在Login类中创建串行对象Java jssc-从SerialEvent向另一个类传递值,java,serialization,event-handling,jssc,Java,Serialization,Event Handling,Jssc,我正在制作一个使用登录表单并使用串行端口访问Arduino的项目。我必须在应用程序启动时向Arduino发送一个字符串,并等待设备的响应,以便在检查登录用户名和密码是否正确之前知道其已准备好操作。我创建了两个类,一个叫做Login,用于检查用户名和密码,另一个叫做serial,包含jssc实现 我正在使用java simple serial connector库和找到的示例 这个函数在Login类中创建串行对象 try { reader.connect(comReader);
try {
reader.connect(comReader);
writer.connect(comWriter);
//Message to Arduino, wait response.
writer.serialWrite("1");
synchronized(writer){
try{
writer.wait();
}
catch(Exception e){
e.printStackTrace();
}
}
} catch (Exception ex) {
lblMensaje.setText("Fallo de conexion serial.");
System.out.println(ex);
}
我成功地将数据发送到Arduino并接收响应,但我不知道如何将该值传递给Login类。我得到的只是一个空值或者什么都没有。我尝试使用wait方法,尝试在serial中传递一个新的Login实例,并尝试通过getter变量将该方法公开,但到目前为止没有任何效果
将SerialEvent变量传递给调用类的正确方法是什么?该类如何知道串行事件已完成,以继续比较登录表单?没关系,在对并发性进行了深入研究后,发现了如何使其工作。显然,为了访问实时更新的值,您需要设置一个锁对象,该对象基本上阻止给定线程,直到它完成变量更新 所以答案是:
- 生成在SerialEventHandler中调用的set方法并实现锁
- 生成一个get方法,该方法将在需要检索数据并等待锁完成的任何位置调用
public class Serial implements SerialPortEventListener {
public final Object lock = new Object();
@Override
public void serialEvent(SerialPortEvent event) {
if(event.isRXCHAR() && event.getEventValue() > 0) {
try {
receivedData += serialPort.readString(event.getEventValue());//serialPort.readString(event.getEventValue());
setData(receivedData);
}
catch (SerialPortException ex) {
System.out.println("Error in receiving response from port: " + ex);
}
}
}
public void setData(String data){
synchronized(lock){
readData = data;
ready = true;
lock.notifyAll();
}
}
public String getData() throws InterruptedException{
synchronized(lock){
while(ready == false){
lock.wait();
}
String temp = readData;
readData = "";
return temp;
}
}
}
这在我的登录类中实现如下:
try {
reader.connect(comReader);
writer.connect(comWriter);
//Enviar mensaje de conexion a Arduino principal y eperar respuesta.
writer.serialWrite("1");
} catch (Exception ex) {
System.out.println(ex);
}
try {
System.out.println("Recibi dato: " + writer.getData());
} catch (InterruptedException ex) {
Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
}
try {
reader.connect(comReader);
writer.connect(comWriter);
//Enviar mensaje de conexion a Arduino principal y eperar respuesta.
writer.serialWrite("1");
} catch (Exception ex) {
System.out.println(ex);
}
try {
System.out.println("Recibi dato: " + writer.getData());
} catch (InterruptedException ex) {
Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
}