2012-02-28 134 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

相关问题