2016-05-20 1 views
0

Je travaille sur un terminal Ingenico pour le traitement des transactions. J'utilise des sockets et des ports série pour communiquer avec le serveur principal. Le port série et le port série communiquent entre eux, c'est-à-dire que toutes les données reçues sur le port série sont immédiatement écrites sur le flux de sortie de la prise et toutes les données reçues sur la prise sont écrites sur le port série. Par exemple: lorsque le socket envoie un message au port série, le port série répond avec un accusé de réception dans un certain nombre de millisecondes puis le port série envoie un autre message. à la prise et vice versa.Java: Pouvons-nous lire avec et sans timeout à partir d'un port série en utilisant les conditions?

J'ai besoin d'un mécanisme de temporisation qui vérifie si je reçois un ACK dans un certain délai (quelques millisecondes). J'ai utilisé Timer et TimerTask pour ce faire. Et j'ai une lecture conditionnelle du port série pour le faire. Ma question est si cela va fonctionner? Suis-je sur la bonne voie?

code

jusqu'à présent:

public void serialEvent(SerialPortEvent event) 
{ 
    byte[] BytesFromSerialPort = null; 
    //timeout of 500ms to get either an ACK or NAK from the serial port or the socket on port 6000 
    int timeout = 10; 

    if(event.isRXCHAR() && event.getEventValue() > 0) 
    { 
     BytesFromSerialPort = new byte[event.getEventValue()]; 
     try 
     { 
      if(IsAckExpected) 
       BytesFromSerialPort = serialPort.readBytes(event.getEventValue(), 1000*timeout); 
      else 
       BytesFromSerialPort = serialPort.readBytes(event.getEventValue()); 

      //print statements 
      System.out.printf("SERIAL RX %04d: ", event.getEventValue()); 
      for(byte b : BytesFromSerialPort) 
       System.out.printf("%c", (char)b); 
      System.out.println(); 
} 
} 

La condition: Si le message suivant est prévu un ACK alors je fixe un délai d'attente sur elle.

+0

Vous n'avez pas besoin de 'Timer' ou de' TimerTask' lorsque vous avez déjà un mécanisme de lecture avec délai que vous utilisez déjà. Pas clair ce que vous demandez. – EJP

+0

Je dois définir un délai d'attente uniquement lorsque le socket est sur le point de recevoir un ACK du port série et vice versa. Je n'ai pas besoin d'un mécanisme de temporisation lorsque le socket et le port série communiquent avec d'autres messages. L'utilisation du mécanisme de temporisation de JSSC imposera un délai à toutes les lectures, ce que je ne veux pas. – user3754878

+0

Je comprends. Je n'ai pas besoin d'une tâche de minuterie. Mais le code suivant va-t-il fonctionner? Pouvons-nous définir des délais d'attente différents pour les lectures de socket en fonction des conditions? – user3754878

Répondre

-1

Fondamentalement ce que vous essayez de faire est connu sous le nom de redirection de port com. D'abord vous lisez/écrivez non-bloquant pour vous assurer que l'application n'est jamais bloquée dans les opérations en série. Deuxièmement, pensez à utiliser Thread.sleep couplé avec le nombre de tentatives pour rendre l'algorithme plus fort.

Essayez la bibliothèque du gestionnaire de communication série pour la communication par port série dans Java. Voir implémentation de xmodem dans leur code source sur github car il contient à la fois le timeout et la lecture/écriture basée sur ACK.

En outre, ils sont les pilotes de redirection de port com qui font exactement ce que vous essayez de faire. Si votre projet permet de les considérer. Voir aussi les serveurs de port qui font exactement la même chose que vous avez besoin. Vous devez ajouter de la sécurité si vous utilisez un socket simple pour TCP/IP.