簡體   English   中英

Java jssc-將值從SerialEvent傳遞到另一個類

[英]Java jssc - Passing value to another class from SerialEvent

我正在制作一個使用登錄表單並使用串行端口訪問Arduino的項目。 在應用程序啟動時,我必須將字符串發送給Arduino,並等待設備的響應以知道其已准備就緒,然后再檢查登錄用戶名和密碼是否正確。 我做了兩個類,一個叫做Login,用來檢查用戶名和密碼,另一個叫做serial,它包含jssc實現。

我正在使用庫java簡單串行連接器,並在此處找到示例。

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變量傳遞給調用類的正確方法是什么? 那個班級如何知道串行事件已經完成以繼續比較登錄表單?

沒關系,經過對並發性的深入研究后,發現了如何使其工作。 顯然,為了訪問實時更新的值,您需要設置一個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;
    }
}
}

這是在我的Login類中實現的,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM