2012-04-05 9 views
2

RXTXのWebサイトから既に作成された例を編集しました。私はJavaとシリアル通信のプログラミングでも新しいです。RXTX双方向シリアル通信は最初の実行後にデータを送信しません

アプリは完全に1回実行されます。 PICからバッファを読み取り、入力した番号を送信します。 LEDランプとPICが同じバッファを送り返し、番号を要求します。しかし、私がそれを入力すると、LEDが消灯し、何も点灯しなくなり、再び番号を尋ねるメッセージが表示されます。

ハイパーターミナルで完全に動作するため、マイクロコントローラのソフトに問題はありません。

コードは以下の通りです:それはあなたが正確に行うには、PICをプログラムしてきたものは明らかではないので

import gnu.io.CommPort; 
import gnu.io.CommPortIdentifier; 
import gnu.io.SerialPort; 
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

/** 
* This version of the TwoWaySerialComm example makes use of the 
* SerialPortEventListener to avoid polling. 
* 
*/ 
public class Test 
{ 
    public Test() 
    { 
     super(); 
    } 

    void connect (String portName) throws Exception 
    { 
     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(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); 

       InputStream in = serialPort.getInputStream(); 
       OutputStream out = serialPort.getOutputStream(); 

       serialPort.addEventListener(new SerialReader(in)); 
       serialPort.notifyOnDataAvailable(true); 

       (new Thread(new SerialWriter(out))).start(); 

      } 
      else 
      { 
       System.out.println("Error: Only serial ports are handled by this example."); 
      } 
     }  
    } 

    /** 
    * Handles the input coming from the serial port. A new line character 
    * is treated as the end of a block in this example. 
    */ 
    public static class SerialReader implements SerialPortEventListener 
    { 
     private InputStream in; 
     private byte[] buffer = new byte[1024]; 

     public SerialReader (InputStream in) 
     { 
      this.in = in; 
     } 

     public void serialEvent(SerialPortEvent arg0) { 
      int data; 

      try 
      { 
       int len = 0; 
       while ((data = in.read()) > -1) 
       { 
        if (data == '\n') { 
         break; 
        } 
        buffer[len++] = (byte) data; 
       } 
       System.out.print(new String(buffer,0,len)); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
       System.exit(-1); 
      }    
     } 

    } 

    /** */ 
    public static class SerialWriter implements Runnable 
    { 
     OutputStream out; 

     public SerialWriter (OutputStream out) 
     { 
      this.out = out; 
     } 

     public void run() 
     { 
      try 
      {     
       int c = 0; 
       while ((c = System.in.read()) > -1) 
       { 
        this.out.write(c); 
       }     
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
       System.exit(-1); 
      }    
     } 
    } 



    public static void main (String[] args) 
    { 
     try 
     { 
      (new Test()).connect("COM3"); 
     } 
     catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


} 
+0

2回目の実行から、JavaアプリケーションはPICに送信された文字列に新しい行を追加することが分かりました。たとえば、 '2'の代わりに、' '[new line] 2''を送信します。 –

+0

使用しているRXTXのバージョンと実行中のOSを正確に指定する必要があります。ノンブロッキング受信イベントに関連する問題がありました。例:http://stackoverflow.com/questions/1391946/is-constant-polling-in-rxtx-necessary – kaliatech

+0

最初のコメントを読んだあと、おそらくあなたは 'this.out.write (c); 'あなたが入力した文字に加えて、Enterキーの押下(\ n)を送信します。結果として、あなたのPICがどのようにコード化されているかに応じて、恐らくそれは第2の "実行"を台無しにしているでしょう。 (そして「実行」すると、2番目のループを意味すると思います) – kaliatech

答えて

0

あなたの質問は(私には)明確ではありません。私の推測だが、ターミネーターとして\ n文字の周りにあなたの期待は、問題の原因となっているということです。

+0

PICが '\ n'を送信するのではなく、コンピュータを送信しています。 –

+0

また、あなたのPICが何をしているのかは分かりません。あなたの質問は "_アプリケーションが完璧に1回実行され、PICからバッファを読み取り、入力した番号を送信します。あなたのPICが電力を受け取るとすぐにあらかじめ定義されたメッセージを送信していない限り、それは理にかなっていません。同様に、あなたのコメントは意味をなさない。コード化されているように、java/rtxプログラム(コンピュータ)はPICから\ n最後にメッセージを受け取ることを期待しています。おそらくあなたは、PICがコンピュータがそれを送信したものだけをエコーすると言っているでしょうか? – kaliatech

+0

PICは入力番号を受け取り、それをバイナリに変換し、LEDを使用して表示します。 –

関連する問題