[英]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對象,該對象本質上阻塞給定線程,直到完成更新變量為止。
因此答案是:
以下是我在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.