Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jssc-从SerialEvent向另一个类传递值_Java_Serialization_Event Handling_Jssc - Fatal编程技术网

Java jssc-从SerialEvent向另一个类传递值

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);

我正在制作一个使用登录表单并使用串行端口访问Arduino的项目。我必须在应用程序启动时向Arduino发送一个字符串,并等待设备的响应,以便在检查登录用户名和密码是否正确之前知道其已准备好操作。我创建了两个类,一个叫做Login,用于检查用户名和密码,另一个叫做serial,包含jssc实现

我正在使用java simple serial connector库和找到的示例

这个函数在Login类中创建串行对象

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方法,该方法将在需要检索数据并等待锁完成的任何位置调用
以下是我在jssc实现中使用的代码:

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);
    }