2013-05-11 5 views
0

J'ai trouvé cet exemple en utilisant la bibliothèque RXTX. Cela fonctionne bien mais j'essaie de comprendre comment cela fonctionne. Voici le morceau de code.Java Serial Reader

public static class SerialReader implements Runnable 
     { 
      InputStream in; 
      Robot robot; 
      int x; 
      int y; 
      public SerialReader (InputStream in , Robot robot) 
      { 
       this.in = in; 
       this.robot = robot; 
      } 

      public void run() 
      { 
       byte[] buffer = new byte[1024]; 
       int len = -1; 
       try 
       { 
        while ((len = this.in.read(buffer)) > -1) 
        { 

         System.out.print(new String(buffer,0,len)); 

        } 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       }    
      } 
     } 

Ce que j'essaie de comprendre est la boucle while. On dirait qu'il charge le buffer depuis le flux d'entrée mais depuis RS-232 envoie un octet à la fois, im confus. Ce que j'essaie de faire est d'obtenir la représentation entière du résultat qui est imprimé.

+0

résultat console est comme ceci: 0 \ n 0 \ n 0 \ n –

Répondre

0

Qu'est-ce qui prête à confusion? Même si les données sont envoyées un octet à la fois, une séquence d'octets peut être accumulée dans le tampon afin que vous puissiez lire toute la séquence à la fois. La valeur len est le nombre d'octets en séquence reçus. La façon dont vous traitez les données reçues peut cependant être modifiée pour refléter vos attentes. Essayez par exemple le remplacement de cette

System.out.print(new String(buffer,0,len)); 

avec ceci:

StringBuffer sb = new StringBuffer(); 
for (int i = 0; i < len; i++) { 
    sb.append(String.valueOf(buffer[i])); 
} 
System.out.print(sb.toString()); 
+0

La partie source de confusion est le nombre d'octets reçus. Qu'est-ce qui décide de cette longueur? Je faisais quelque chose de similaire à votre approche mais cet exemple vous m'a donné des résultats avec beaucoup de sb vide. Cela semble correct quand j'utilise l'impression mais c'est plus évident avec println. J'ai même essayé de supprimer les octets non-chiffres mais je ne pouvais toujours pas me débarrasser des zéros. –

+0

Le premier exemple donne 0 avec un retour à la ligne même avec la fonction print(). Le deuxième exemple donne le résultat avec une séquence comme quelques lignes vides, 48 ​​newline 13 newline 10 et quelques nouvelles newlines –