Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simuler le clavier pour faire une saisie.

OutputStream sur port serie.

Sujet résolu
    10 avril 2012 à 15:28:59

    Bonjour à tous. :)

    J'explique mon problème. Je veux écrire sur un port série.
    Pour ça j'utilise ma petite classe SerialWriter qui marche très bien.
    Je la cache car peut-être que tout le monde ne veut pas la voir. ;)

    import java.io.IOException;
    import java.io.OutputStream;
    /********************************
     * 
     * Classe de création de l'ecriture
     * sur port serie
     * J'ai une variable global qui change selon ce que je veux envoyer comme trame
     * sur le port série de ce Thread.
     * 
     *******************************/
    
    public class SerialWriter implements Runnable{
    	OutputStream out;
    	static String str;
    	
    	public SerialWriter ( OutputStream out )
    	{
    		this.out = out;
    	}
    
    	public void run ()
    	{
    		try
    		{                
    			byte[] TWOPM = str.getBytes();
    			while ( (System.in.read()) > -1 )
    			{
    				//this.out.write(c);
    				out.write(TWOPM);
    			}                
    		}
    		catch ( IOException e )
    		{
    			e.printStackTrace();
    		}            
    	}
    }
    


    Mais je veux qu'il écrive après certains traitements, le problème ce que j'ai l’écoute et l’écriture du port dans un Thread.

    (new Thread(new SerialReader(in, info))).start();
    (new Thread(new SerialWriter(out))).start();
    


    Comment je peux à un moment dans mon Thread de SerialReader simuler la saisie de la touche entrer ou n’importe quoi d'autre qui valide la saisie.

    Parce que je n'arrive pas à lancer une écriture sur le port autrement qu'en saisie sur la console de mon éclipse.

    De plus j'ai un petit soucis, je fais des Thread, pourquoi lorsque je fais une saisie, il me la fait pour tous les ports série et pas pour un seul ?
    Comment je peux différencier mes Threads et choisir sur lequel je veux faire ma saisie ?

    Merci d'avance. :D
    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2012 à 15:52:09

      Pour le problème sur tout les threads :

      System.in.read()

      tous les threads vont donc lire sur stdin. Ton problème vient de là.

      Je ne comprends pas ton problème majeur avec les threads.

      Dis moi si je me trompe.

      tu voudrais écrire sur le port de sortie automatiquement après avoir reçu quelque chose sur le port d'entrée ?

      En gros tu veux supprimer l'action humaine de valider l'envoie pour le faire automatiquement ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2012 à 16:54:31

        Citation : Psinami

        Pour le problème sur tout les threads :
        En gros tu veux supprimer l'action humaine de valider l'envoie pour le faire automatiquement ?



        C'est exactement ça.
        Je veux lancer l’écriture quand j'ai fini de traiter la trame que je reçois de l’appareil.
        Le seul souci c'est qu'il veut que ce soit fait manuellement, donc je tape sur entrer dans ma console...

        Or, je ne veux pas. Je veux que ça pop direct, donc j'ai soumis l'idée de simuler l'appuie sur la touche entrer.
        Mais bon c'est pas vraiment optimisé.
        Mais dans l'immédiat je n'ai que ça.

        Je continue de chercher dans mon coin.

        Citation : Psinami

        Pour le problème sur tout les threads :

        System.in.read()

        tous les threads vont donc lire sur stdin. Ton problème vient de là.



        Je suis donc dans l'impasse je ne peux pas les différencier ?
        Parce que ça risque de poser problème. Quoi que... A voir.
        • Partager sur Facebook
        • Partager sur Twitter
          10 avril 2012 à 18:11:45

          Alors a mon avis tu devrais regarder du coté de wait() et notify() en java. Je pense que ça s'apelle Moniteur.

          Car en fait il te suffirait de traiter la trame dans ton thread puis ce thread va en fait reveiller le thread d'envoie et lui dire d'envoyer la réponse.

          • Partager sur Facebook
          • Partager sur Twitter
            17 avril 2012 à 10:32:34

            Bon après un moment, je vous explique comment j'ai réglé le problème.

            public Nidek(String lineTrame, String model, String port, OutputStream out) {
            toMyVar(lineTrame);
            IncMyXml.incMyXml();
            String str = "NINJA ON ROCK";
            try {
            	out.write(str.getBytes());
            } catch (IOException e) {
            	e.printStackTrace();
            }
            System.out.println("ECRIS");
            }
            

            Ce qu'il me manquais pour réussir c’était un out qui soit sur le même port que le sur celui que j'ai instancié dans le Thread.

            Quand je voulais le créer il me disait que je ne pouvais parce que le port était déjà occupé.
            J'ai donc crée ma variable "Outputstream out" avant de lancer l’écoute dans mon Thread, je peux donc initialiser le port avec ce out et le donner en argument dans le Thread d’écoute.

            void connect (Info info) throws Exception // Classe prédéfinie dérivée de la classe Throwable, classe dérivée
            	{
            int baud = Integer.parseInt(info.getBaud());
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(info.getPort());
            if ( portIdentifier.isCurrentlyOwned() )// test de port busy ou pas.
            {
            	System.out.println("Erreur: Le port est actuellement utilisé.");
            }
            else
            {
            	CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
            	if ( commPort instanceof SerialPort )
            	{
            		SerialPort serialPort = (SerialPort) commPort;
            		serialPort.setSerialPortParams(baud,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
            		// j'ai mis ces paramètres arbitrairement, à modifier si besoin.
            		InputStream in = serialPort.getInputStream();
            		OutputStream out = serialPort.getOutputStream();
            		(new Thread(new SerialReader(in, info, out))).start();
            	}
            	else
            	{
            		System.out.println("Erreur: Seuls les ports série sont traitées ici");
            	}
            }     
            }
            


            Parce qu'une foi que la variable faite il veut bien l'utiliser.
            En faite a partir du moment où l'on lance une écoute il faut avoir préparé tout ses variables avant parce que l’écoute ne permet plus de faire des tests sur le port.
            Après il n'accepte plus que l’écriture et la lecture.

            Ma technique était vraiment mauvaise et je faisais le mauvais choix avec un robot etc...

            Pour répondre au Thread, sinon pour simuler la saisie clavier il faut créer un élément robot et lui donner une série de commande pour simuler l'appuie d'une touche.

            java.awt.Robot


            La doc expliquera ça mieux que moi. En tout cas c'est très simple.
            • Partager sur Facebook
            • Partager sur Twitter

            Simuler le clavier pour faire une saisie.

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown