将InputString转换为String,就像程序不挂起一样

时间:2012-04-12 12:11:54

标签: java serial-port inputstream

我的程序可以使用inputStream.toString();运行,但您知道这不是将inputStream转换为String的好方法。因此,当我尝试正确转换时,它会挂起。 我的方法是:

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    if(initialized && connected){
        try{
            sms.findOperator();
            jTextArea2.append(sms.logString);
            sms.logString = "";
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(null, "Failed to find operator!", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
    }
    else JOptionPane.showMessageDialog(null, "Cannot connect to the port specified!", "ERROR", JOptionPane.ERROR_MESSAGE);
    // TODO add your handling code here:
}

这是findOperator()方法:

    public void findOperator(){  
        send("AT+COPS?\r\n");
}

以下是send()方法:

    public void send(String cmd) {
    try {
        //Thread.sleep(200);
        outputStream.flush();
        outputStream.write(cmd.getBytes());
        inputStream = serialPort.getInputStream();
        //System.out.println(" Input Stream... " + inputStream.toString());
        Thread.sleep(300);

        logString += inputStreamtoString(inputStream);
    }
    catch(Exception e){
        e.printStackTrace();            
    }
    finally{

        //logString += inputStream.toString()+ '\n';
//            if(infoType == "msg") return "Input Stream... " + inputStream.toString()+     '\n';
//            else return inputStream.toString();    
        //return logString;
        //logString += inputStreamtoString(inputStream);
    }

}

这是inputStreamtoString()方法:

    public String inputStreamtoString(InputStream is) throws IOException{
//        try {
//            return new java.util.Scanner(is).useDelimiter("\\A").next();
//        } catch (java.util.NoSuchElementException e) {
//            return "";
//        }        

    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 

    String line = null; 

    try { 
        while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
        } 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } finally { 
        try { 
        is.close(); 
        } catch (IOException e) { 
        e.printStackTrace(); 
        } 
    }

    return sb.toString(); 
}

如果我不使用inputStreamtoString()方法并使用inputStream.toString()我的程序运行良好,但我没有得到正确的字符串。有什么建议吗? 提前谢谢......

更新:我的调制解调器使用端口COM3和GSM SIM卡。我得到一个包含巨大空间的字符串,如:

+COPS:                  <...500 spaces...>                    0,0,"Banglalink"

所以我讨厌这个空间。我需要一个字符串:+COPS: 0,0,"Banglalink"

1 个答案:

答案 0 :(得分:1)

您正试图从连接到串行端口的流中详尽地阅读(直到读取所有数据)。如果端口上没有可用数据(等待数据到来),这将挂起。即使有数据,也会有无限循环。

更新: 你可以尝试这样的东西(改编自列出的代码here):

 byte[] readBuffer = new byte[200];

 try {
   while (is.available() > 0) {
     int numBytes = is.read(readBuffer);
     sb.append(new String(readBuffer, "US-ASCII"));
   }
 } catch (IOException e) {
   // handle exception
 }

UPDATE:将字符串创建变为使用指定的字符集(而不是系统默认值)