0

ログインフォームを使用し、シリアルポートを使用して Arduino にアクセスするプロジェクトを作成しています。アプリケーションの起動時に Arduino に文字列を送信し、デバイスからの応答を待って、ログイン ユーザー名とパスワードが正しいことを確認する前に、操作の準備ができていることを確認する必要があります。ユーザー名とパスワードをチェックする Login という名前のクラスと、jssc 実装を含む serial という名前の 2 つのクラスを作成しました。

私はライブラリ Java シンプル シリアル コネクタを使用しており、例は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 クラスに渡す方法がわかりません。私が得るのはnull値か何もありません。私は待機メソッドを使用してみました.ログインの新しいインスタンスをシリアル内に渡し、ゲッター変数を介してメソッドを公開しようとしましたが、これまでのところ何も機能していません.

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

それは次のように 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);
    }
于 2015-05-03T12:31:46.107 に答える