1

私のプログラムは で実行できますinputStream.toString();が、ご存じのとおり、それは に変換する良い方法ではありませinputStreamString。そのため、適切に変換しようとするとハングします。私の方法は次のとおりです。

    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"

4

1 に答える 1

1

シリアル ポートに接続されているストリームから徹底的に (つまり、すべてのデータが読み取られるまで) 読み取ろうとしています。ポートに利用可能なデータがない場合(データが来るのを待っている場合)、これはハングします。データがあっても無限ループになります。

更新: 代わりに次のようなものを試すことができます (ここにリストされているコードから適応):

 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
 }

更新: 指定された文字セットを使用するように文字列の作成を変更しました (システムのデフォルトではなく)

于 2012-04-12T12:23:24.940 に答える