2010-08-06 13 views
0

J'ai créé un programme Java qui s'exécute sur un ordinateur avec deux ports RS-232.com0com Terminal RS232 Programme Java

Cela fonctionne plutôt bien. J'ai connecté deux appareils qui communiquent entre eux via RS-232. Je mets l'ordinateur entre le câble.

Vous pouvez voir tout ce qui est envoyé sur une fenêtre de terminal.

Mais après un laps de temps aléatoire, un périphérique cesse de répondre aux requêtes.

Normalement, le périphérique 1 envoie la requête 1 et le périphérique répond.

Mais après un certain temps, l'appareil commence à envoyer la requête 2 et le périphérique 2 ne répond plus.

Voici une capture:

  • Première colonne: port COM id
  • Deuxième colonne: présentation décimale du caractère
  • de la troisième colonne: visualisation des caractères

https://i77.photobucket.com/albums/j74/bertyhell/errors/capture.png?t=1281084570

Pourquoi cela ne fonctionne-t-il pas? Je prévois de rendre le programme terminal open source à l'avenir.

EDIT: Je n'ai pas envoyé de code parce que le code fonctionne. Il ne cesse de fonctionner après 5 min - 1 heure.

Voici le code de connexion:

CommPortIdentifier portIdentifier; 
    portIdentifier = CommPortIdentifier.getPortIdentifier("COM1"); 
    InputStream inCom1; 
    InputStream inCom2; 
    if (portIdentifier.isCurrentlyOwned()) { 
     addError("COM1 in use!, please restart"); 
    } 
    else { 
     SerialPort serialPort = (SerialPort) portIdentifier.open("Main", 2000); 
     //19200 8n1 
     serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
     // CTS/RTS handshaking 
     serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT); 
     //Set sender 
     Com1Sender.setWriterStream(serialPort.getOutputStream()); 
     //Set receiver 
     // new com1_receive(serialPort.getInputStream()).start(); 

     inCom1 = serialPort.getInputStream(); 

     portIdentifier = CommPortIdentifier.getPortIdentifier("COM2"); 
     if (portIdentifier.isCurrentlyOwned()) { 
      addError("COM2 in use!, please restart"); 
     } 
     else { 
      serialPort = (SerialPort) portIdentifier.open("Main2", 2001); 
      //19200 8n1 
      serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
      // CTS/RTS handshaking 
      serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT); 
      //Set sender 
      Com2Sender.setWriterStream(serialPort.getOutputStream()); 
      //set receiver 
      // new com2_receive(serialPort.getInputStream()).start(); 

      inCom2 = serialPort.getInputStream(); 
      new Receiver(inCom1, inCom2).start(); 
     } 
    } 

Ceci est le récepteur:

public class Receiver extends Thread { 
     InputStream inCom1; 
     InputStream inCom2; 

     public Receiver(InputStream inCom1, InputStream inCom2) { 
      this.inCom1 = inCom1; 
      this.inCom2 = inCom2; 
     } 

     @Override 
     public void run() { 
      try { 
       int b1; 
       int b2; 
       while (true) { 
        // if stream is not bound in.read() method returns -1 

        //dect 
        while ((b1 = inCom1.read()) != -1) { 
         //Send trough to COM2 
         Com2Sender.send(new byte[]{(byte) b1}); 
         Main.addText(Integer.toString(b1), true); 
        } 

        //televic 
        while ((b2 = inCom2.read()) != -1) { 
         //Send trough to COM2 
         Com1Sender.send(new byte[]{(byte) b2}); 
         Main.addText(Integer.toString(b2), false); 
         MessageExtractor.add(b2); 
        } 

        // Wait 10 ms when stream is broken and check again. 
        sleep(10); 
       } 
      } catch (Exception e) { 
       Main.addError(e.getMessage()); 
      } 
     } 
    } 

C'est l'un des expéditeurs:

public class Com1Sender { 
     static OutputStream out; 

     public static void setWriterStream(OutputStream out) { 
      Com1Sender.out = out; 
     } 

     public static void send(byte[] bytes) { 
      try { 
       // Sending through serial port is simply writing into OutputStream. 
       out.write(bytes); 
       out.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public static void send(int letter) { 
      try { 
       Main.addText(Character.toString((char)letter), false); 

       // Sending through serial port is simply writing into OutputStream. 
       out.write(new byte[]{(byte)letter}); 
       out.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

Vous trouverez que si vous postez des éléments clés du code, les codeurs vous fourniront beaucoup plus d'informations pour vous aider à trouver une réponse. Par exemple, comment lisez-vous et écrivez-vous dans les ports? –

+0

ok ajouté le code espérons qu'il ne fait pas peur ppl loin ^^ – Berty

Répondre