2012-04-05 9 views
2

Ich habe ein bereits erstelltes Beispiel von der RXTX Website bearbeitet. Ich bin neu in Java und Serial Comm Programmierung auch.RXTX serielle Zweiwegekommunikation sendet keine Daten nach dem ersten Lauf

Die App läuft perfekt einmal. Er liest den Puffer vom PIC und sendet die Nummer, die ich eingegeben habe. Die LEDs leuchten und der PIC sendet denselben Puffer zurück und fragt nach einer Nummer. Aber wenn ich es betrete, schalten sich die LEDs aus, nichts leuchtet wieder auf und ich bekomme wieder die Nachricht nach einer Nummer gefragt.

Es ist nichts falsch mit dem weichen des Mikrocontrollers, wie es mit HyperTerminal tadellos funktioniert.

Der Code ist unten:

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

Ich habe herausgefunden, dass die Java-App dem zweiten Lauf eine neue Zeile zu der an den PIC gesendeten Zeichenfolge hinzufügt. Zum Beispiel anstelle von '2' sendet es' [neue Zeile] 2' –

+0

Sie sollten wahrscheinlich genau angeben, welche Version von RXTX Sie verwenden und auf welchem ​​Betriebssystem Sie laufen. Es gab Probleme im Zusammenhang mit nicht blockierenden Empfangsereignissen. Beispiel: http://stackoverflow.com/questions/1391946/is-constant-polling-in-rxtx-necessary – kaliatech

+0

Nachdem ich Ihren ersten Kommentar gelesen hatte, fiel mir ein, dass Sie das 'this.out.write 'vielleicht nicht erkennen (c); 'sendet die Eingabetaste (\ n) zusätzlich zu dem von Ihnen eingegebenen Zeichen. Als Ergebnis und abhängig davon, wie Ihr PIC codiert ist, führt das vielleicht zu einem zweiten "Lauf". (Und mit "run", ich denke du meinst die zweite Schleife.) – kaliatech

Antwort

0

Ihre Frage (für mich) nicht klar ist, weil es nicht klar, was Du das Bild programmiert haben genau das zu tun. Meine Vermutung ist jedoch, dass Ihre Erwartungen an den \ n Charakter als Terminator ein Problem verursachen.

+0

Nicht der PIC sendet das '\ n', sondern den Computer. –

+0

Wieder ist es mir nicht klar, was Ihr PIC tut. Ihre Frage lautet "_Die App läuft einmalig einwandfrei. Sie liest den Puffer vom PIC und sendet die Nummer, die ich eingegeben habe._". Das ist jedoch nicht sinnvoll, es sei denn, Ihr PIC sendet eine vordefinierte Nachricht, sobald er mit Strom versorgt wird. Ähnlich macht dein Kommentar keinen Sinn. Wie programmiert, erwartet das Java/RTX-Programm (der Computer) eine Nachricht vom PIC mit \ n am Ende. Vielleicht sagst du, dass der PIC einfach das widerspiegelt, was auch immer der Computer sendet? – kaliatech

+0

Der PIC nimmt die Eingangsnummer, wandelt sie in Binärwerte um und zeigt sie mit den LEDs an. –