0

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

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

public class PortReader implements SerialPortEventListener {
    @Override
    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR() && event.getEventValue() > 0) {
            try {
                synchronized(this){
                    String receivedData = serialPort.readString(event.getEventValue());
                    System.out.println("Received response from port: " + receivedData);
                    serialPort.closePort();
                }
            }
            catch (SerialPortException ex) {
                System.out.println("Error in receiving response from port: " + ex);
            }
        }
    }
}

此函数在 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 类。我得到的只是一个空值或什么都没有。我尝试过使用等待方法,尝试在串行内部传递一个新的 Login 实例,并尝试通过 getter 变量将该方法公开,但到目前为止没有任何效果。

将 SerialEvent 变量传递给调用类的正确方法是什么?该类如何知道串行事件已完成以继续比较登录表单?

4

1 回答 1

0

没关系,在对并发进行了一些深入的研究之后,找到了如何使它工作。显然,为了访问实时更新的值,您需要设置一个 Lock 对象,该对象基本上阻塞给定线程,直到它完成更新变量。

所以答案是:

  • 生成在 SerialEventHandler 内部调用的 set 方法并实现 Lock。
  • 生成一个 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);
    }
于 2015-05-03T12:31:46.107 回答