2012-02-28 63 views
0

我正在開發一個應用程序,使用java-simple-serial-connector API讀取 並寫入串行端口。當我嘗試讀取數據字節 並將它們分配給全局字符串變量(sReader)時,我遇到了問題。 sReader不會獲得整個字符串,並且其長度每次都是隨機的。我相信我收到所有的字節,因爲當我將字符串sBuffer附加到Output(Output.append)時,總是顯示整個字符串。請看看我的示例代碼如下:java - 無法在invokeAndWait中賦值給全局字符串變量

public class SerialPortTest extends javax.swing.JFrame { 

    private String sReader = ""; 
    private JTextArea outputTextArea; 
    private JLabel outputLabel; 

    private class Reader implements SerialPortEventListener { 

     private String sBuffer = ""; 

     @Override 
     public void serialEvent(SerialPortEvent spe) { 

      if (spe.isRXCHAR() || spe.isRXFLAG()) { 

       if (spe.getEventValue() > 0) { 

        try { 

         //Read chars from buffer 
         byte[] bBuffer = serialPort.readBytes(spe.getEventValue()); 
         sBuffer = new String(bBuffer); 

         SwingUtilities.invokeAndWait(
           new Runnable() { 

            @Override 
            public void run() { 

             sReader = sBuffer;//does not assign full string 

             outputLabel.setText(sBuffer);//does not set full string 

             outputTextArea.setText(sBuffer);//does not set full string 

             outputTextArea.append(sBuffer);//This works! Why the above don't work? 

            } 
           }); 

        } catch (SerialPortException | InterruptedException | InvocationTargetException ex) { 
        } 
       } 
      } 
     } 
    } 
} 
+1

請注意'Output'是一個實例變量,按照慣例,應該以小寫字母開頭。 – DNA 2012-02-28 20:56:01

+0

感謝您注意到,這是一個意外,因爲我正在快速鍵入示例 – jadrijan 2012-02-28 20:58:32

回答

1

我假設你想從代碼的其他部分訪問sReader。在這種情況下,考慮使sReader易失性並在創建Runnable之前分配它。另外,如果sBuffer僅用於在Runnable中使用字符串,請考慮將其作爲最終的局部變量。

private volatile String sReader = ""; 
... 

final String sBuffer = new String(bBuffer); 
sReader = sBuffer; 

SwingUtilities.invokeAndWait(
... 
+0

這正是我需要sReader字符串的原因......不幸的是,使用您的建議我沒有修復問題:( – jadrijan 2012-02-28 21:45:53

+1

然後考慮您正在接收多個serialEvent調用,並且你正在看到調用的片段。也許sReader應該是你追加的StringBuilder。 – Clint 2012-02-28 22:36:01

+0

非常棒的一點,我會試試看。 – jadrijan 2012-02-29 14:10:36