2013-04-26 89 views
0

我在串行通信(/ dev/ttyS0)的ARM處理器上進行串行通信的應用。 我的處理器是armv7l(512 RAM,Linux OS(debian.imag))。我遇到了一些我無法理解的錯誤,或者它爲什麼會發生一些時間(而不是每次)?我的代碼和錯誤如下。所以,如果你有任何想法或建議,那麼請告訴我。如何在線程「AWT-EventQueue-0」中的線程「TimerQueue」異常中解決異常像java中的java.lang.IllegalMonitorStateException異常?

//Imports were here... 

public class SerialCommandApp extends JPanel { 

    public static javax.swing.JTextField inpuText; 
    private javax.swing.JLabel inputLbl; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JScrollPane jScrollPane2; 
    private javax.swing.JLabel outPutLbl; 
    public static javax.swing.JTextArea outPuttextArea; 
    private javax.swing.JLabel tempLbl; 
    public static javax.swing.JLabel tempShowLbl; 
    public static javax.swing.JTextArea temptextArea; 
    public static boolean inputFlag = false; 
    public OutputStream out = null; 
    String command = "t0?\n"; 
    int count=1; 
    public Timer tmr = new Timer(1000, new ActionListener() { 

     public void actionPerformed(ActionEvent evt) { 

      if (count == 0) { 
       sendCommand(); 
      } 
      count--; 
     } 
    }); 

    public void sendCommand() { 

     final Thread SendThread = new Thread() { 

      @Override 
      public void run() { 
       count = 1; 
       try { 
        out.write(command.getBytes()); 
        out.flush(); 
       } catch (IOException ex) { 
        Logger.getLogger(SerialCommandApp.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }; 
     SendThread.setDaemon(true); 
     SendThread.start(); 
    } 
    public LaserCommandApp() { 
     setComponents(); 
     connect("/dev/ttyS0"); 
     tmr.start(); 
    } 
    private void setComponents() { 
     tempLbl = new javax.swing.JLabel("Temperature :"); 
     tempShowLbl = new javax.swing.JLabel("Label"); 
     inputLbl = new javax.swing.JLabel("InPut :"); 
     inpuText = new javax.swing.JTextField(); 
     outPutLbl = new javax.swing.JLabel("OutPut :"); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     outPuttextArea = new javax.swing.JTextArea(); 
     jScrollPane2 = new javax.swing.JScrollPane(); 
     temptextArea = new javax.swing.JTextArea(40000, 10); 
     this.setBackground(new java.awt.Color(204, 255, 255)); 
     tempLbl.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N 
     tempShowLbl.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N   
     inputLbl.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N 
     inpuText.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N 
     inpuText.setText(""); // NOI18N 
     inpuText.addKeyListener(new java.awt.event.KeyAdapter() { 
      @Override 
      public void keyTyped(java.awt.event.KeyEvent evt) { 
       inpuTextKeyTyped(evt); 
      } 
     }); 
     outPutLbl.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N 
     outPuttextArea.setColumns(20); 
     outPuttextArea.setRows(5); 
     jScrollPane1.setViewportView(outPuttextArea); 
     temptextArea.setColumns(20); 
     temptextArea.setRows(10); 
     jScrollPane2.setViewportView(temptextArea); 
     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(this); 
     this.setLayout(jPanel1Layout); 
     jPanel1Layout.setHorizontalGroup(
       jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addComponent(inputLbl).addContainerGap(482, Short.MAX_VALUE)).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(outPutLbl).addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 253, javax.swing.GroupLayout.PREFERRED_SIZE)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 102, Short.MAX_VALUE).addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)).addGroup(jPanel1Layout.createSequentialGroup().addComponent(inpuText, javax.swing.GroupLayout.PREFERRED_SIZE, 156, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 122, Short.MAX_VALUE).addComponent(tempLbl).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(tempShowLbl, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE))).addGap(36, 36, 36))))); 
     jPanel1Layout.setVerticalGroup(
       jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addComponent(inputLbl).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(inpuText, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(tempLbl, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(tempShowLbl, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addGap(43, 43, 43).addComponent(outPutLbl).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE)).addGroup(jPanel1Layout.createSequentialGroup().addGap(3, 3, 3).addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 222, Short.MAX_VALUE))).addContainerGap())); 

    } 
     private void inpuTextKeyTyped(java.awt.event.KeyEvent evt) { 
     if (evt.getKeyChar() == KeyEvent.VK_ENTER) { 
      try { 
       inputFlag = true; 
       String str = inpuText.getText() + "\n"; 
       out.write(str.getBytes()); 
       out.flush(); 
      } catch (IOException ex) { 
       System.out.println("Errore at enter press button"); 
      } 
     } 
    } 
    public final void connect(String portName) { 
     try { 
      CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); 
      if (portIdentifier.isCurrentlyOwned()) { 
       System.out.println("Error: Port is currently in use"); 
      } else { 
       CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000); 
       if (commPort instanceof SerialPort) { 
        SerialPort serialPort = (SerialPort) commPort; 
        serialPort.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); 
        InputStream in = serialPort.getInputStream(); 
        out = serialPort.getOutputStream(); 
        Thread inputThread = (new Thread(new SerialReader(in))); 
        inputThread.setDaemon(true); 
        inputThread.start(); 
       } else { 
        System.out.println("Error: Only serial ports are handled by this example."); 
       } 
      } 
     } catch (NoSuchPortException npx) { 
      System.out.println("No Such Port is Available"); 
     } catch (Exception ex) { 
      System.out.println("Error occure at connecting to port"); 
     } 
    } 
    public static class SerialReader implements Runnable { 
     String str = ""; 
     String fullString = ""; 
     InputStream in = null; 
     public SerialReader(InputStream in1) { 
      this.in = in1; 
     } 

     @Override 
     public void run() { 
      byte[] buffer = new byte[1024]; 
      int len = -1; 
      try { 
       while ((len = this.in.read(buffer)) > -1) { 
        str = new String(buffer, 0, len); 
        fullString = fullString + str; 

        if (fullString.endsWith("\n")) { 

         if (SerialCommandApp.inputFlag) { 
          SerialCommandApp.inputFlag = false; 
          SerialCommandApp.outPuttextArea.append(fullString); 
          //SerialCommandApp.outPuttextArea.append("\n"); 
         } else { 
          SerialCommandApp.temptextArea.append(fullString); 
          // SerialCommandApp.temptextArea.append("\n"); 
          SerialCommandApp.tempShowLbl.setText(fullString); 
         } 
         fullString = ""; 
        } 

       } 
      } catch (IOException ex) { 
       System.out.println("Errore at reading data"); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     JFrame jFrame = new JFrame(); 
     jFrame.add(new LaserCommandApp()); 
     jFrame.setSize(500, 400); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jFrame.setVisible(true); 
    } 
} 

錯誤:

enter code here 
Exception in thread "TimerQueue" Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException 
    at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:155) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1260) 
    at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:460) 
    at sun.awt.SunToolkit.awtUnlock(SunToolkit.java:245) 
    at sun.java2d.x11.X11Renderer.fillRect(X11Renderer.java:214) 
    at sun.java2d.pipe.ValidatePipe.fillRect(ValidatePipe.java:76) 
    at sun.java2d.SunGraphics2D.fillRect(SunGraphics2D.java:2321) 
    at javax.swing.plaf.basic.BasicTextUI.paintBackground(BasicTextUI.java:658) 
    at javax.swing.plaf.basic.BasicTextUI.paintSafely(BasicTextUI.java:728) 
    at javax.swing.plaf.basic.BasicTextUI.paint(BasicTextUI.java:883) 
    at javax.swing.plaf.basic.BasicTextUI.update(BasicTextUI.java:862) 
    at javax.swing.JComponent.paintComponent(JComponent.java:769) 
    at javax.swing.JComponent.paint(JComponent.java:1045) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5212) 
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236) 
    at javax.swing.JComponent._paintImmediately(JComponent.java:5160) 
    at javax.swing.JComponent.paintImmediately(JComponent.java:4971) 
    at javax.swing.RepaintManager$3.run(RepaintManager.java:796) 
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706) 
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1651) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
    at java.awt.EventQueue.access$200(EventQueue.java:100) 
    at java.awt.EventQueue$3.run(EventQueue.java:682) 
    at java.awt.EventQueue$3.run(EventQueue.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 
java.lang.NullPointerException: 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.compareAndSetState(AbstractQueuedSynchronizer.java:566) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:211) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290) 
    at javax.swing.TimerQueue.addTimer(TimerQueue.java:135) 
    at javax.swing.TimerQueue.run(TimerQueue.java:187) 
    at java.lang.Thread.run(Thread.java:722) 
Exception in thread "AWT-XAWT" java.lang.NullPointerException: 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.compareAndSetState(AbstractQueuedSynchronizer.java:566) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:211) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290) 
    at sun.awt.SunToolkit.awtLock(SunToolkit.java:237) 
    at sun.awt.X11.XBaseWindow.ungrabInput(XBaseWindow.java:883) 
    at sun.awt.X11.XToolkit.run(XToolkit.java:675) 
    at sun.awt.X11.XToolkit.run(XToolkit.java:591) 
    at java.lang.Thread.run(Thread.java:722) 

回答

1
public OutputStream out = null; 

是從來沒有初始化。你有一個NullPointerException。

+1

通過此工作的道具:) – LionC 2013-04-26 13:35:26

+0

@Asier Aranbarri,謝謝你的回覆。但在我的代碼中,我從connect(「/ dev/ttyS0」)方法中拿出(OutPutStream)對象。所以在連接串口後它不爲空。 – Jay 2013-04-26 13:53:27

+0

但是如果這個端口不可用,那麼你就不會進入connect方法的邏輯,程序不會崩潰(因爲你有一個if語句),並且線程可能會試圖做出某些事情。這可能不是問題,正如你所說的,但是,我認爲它可以幫助你:) – 2013-04-26 14:01:12

相關問題