Lecture sur Port serie

gethy06
Lecture sur Port serie

Salut a tous.
J'ai fait des recherche sur ce theme et je n'ai pas trouvé mon probleme evoqué quelque part.

Alors voila.
J'ai un flasheur de code a barre qui est connecté sur le port COM1 de mon PC.
Je veux lire ce qui se passe sur ce port et afficher la trame.
J'utilise ce code :

import javax.comm.*;
import java.io.*;
import java.util.*;
import com.sun.comm.Win32Driver;

/*
Cette classe permet de tester les ports séries disponibles
en les listant puis en créant un stream d'entrée et de sortie
*/
public class TesteJavaComm
{
 CommPortIdentifier portId;
 BufferedReader in;
 PrintWriter out;
 SerialPort serialPort;

 /*
 Constructeur de la classe TesteJavaComm qui prend en paramètre le port série à utiliser.
 Dans un premier temps on liste les ports disponibles sur le pc
 */
 public TesteJavaComm (String com)
 {
  Win32Driver w32Driver= new Win32Driver();
  w32Driver.initialize();
  System.out.println("listage des ports série disponibles:");
  listePortsDispo();
  try
  {
   //ouverture du port série:
   portId=CommPortIdentifier.getPortIdentifier(com);
   serialPort=(SerialPort)portId.open("Envoi",2000);

   int i=0;
   do
   {
    //on sélectionne tous les paramètres de la connexion série:
    serialPort.setSerialPortParams(38400,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
    System.out.println("Ouverture du port "+com);

    //pour lire avec des streams:
    in=new BufferedReader(new InputStreamReader(serialPort.getInputStream()));

    //Teste de lecture sur le port série
    int b = in.read();
    System.out.println(in.read());
    System.out.println(b);
    in.close();
    i++;
   }while(i!=3);
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 }//fin constructeur

 public void listePortsDispo()
 {
  System.err.println("recherche..."); 
  Enumeration portList=CommPortIdentifier.getPortIdentifiers();
  if (portList==null)
  {
   System.err.println("Aucun port de communication détecté");
   return;
  }
  while (portList.hasMoreElements())
  {
   portId=(CommPortIdentifier)portList.nextElement();
   System.out.println("* "+portId.getName());
  } // while
 } //fin de la methode listePortsDispo()

 /*
 Methode main qui permet de tester notre classe de teste en ouvrant une connexion sur le port COM1.
 */
 public static void main(String args[])
 {
  new TesteJavaComm ("COM1");
 }//fin du main
}//fin de la classe

Voila ce que cela m'affiche :

Quote:
Listage des ports série disponibles
recherche...
* COM2
* COM1
* LPT1
* LPT2
Ouverture du port COM1
49
2

Mon soucis c'est que je ne comprends pas ce que represente les valeurs '49' (in.read(); ) et '2' (int b) et comment afficher la trame que je flashe.

Merci pour toute l'aide que vous pourrez m'apporter.

fredericmazue

D'abord, pardonne moi, mais je ne peux pas m'empêcher de le dire, ¤¤¤¤ Java n'est certainement pas le langage le miuex adapté à ce que tu veux faire.

Quote:
les valeurs '49' (in.read(); ) et '2' (int b)

Où ça 49 ?
Pour le deux c'est tout simple, quand tu écris
int b = in.read();

Tu oublies que tu as auparavant décoré le InputStream retourné par serialPort.getInputStream() par un InputStreamReader qui lit des caractères... avec l'encodage par défaut qui en Java est l'Unicode à la sauce Java dans lequel tout les caractères sont encodés sur deux octets. Donc quand tu lis une fois (read()) tu ne lis pas un seul octet sur le port comme, je pense, tu croyais le faire, mais deux. Et du coup, dans le int, il n'y a peut être pas la valeur à laquelle tu t'attends
Evidemment ça ne pas pas aller pour restituer le code barre. Quand je te disais que Java n'est pas un langage qui va bien. :evil:

Pour rémédier au problème, soit tu changes le charset du InputStreamReader, soit tu utilises directement le InputStream retourné par l'API.

Tout ceci soit dit en considérant que le port série est convenablement configuré bien sûr. Si ce n'est pas la cas, tu peut avoir aussi (et en plus) des lectures erratiques. Mais bon ça c'est éventuellement un autre problème. Partons du principe que le port est bien configuré :)

gethy06

Merci pour ta reponse ...

J'ai reussi a remedier au probleme.

En fait, l'entier renvoyé est en decimal et est le premier caractere de ma chaine, c'est a dire "le bit de start (stx)", donc j'ai fais une boucle pour recuperer tous les caracteres jusqu'au "bit de stop (etx)" et puis je les ai convertit en caracteres lisibles.

Le language java est le plus pratique que j'ai pu trouver (et certainement pas le plus adapté ....).

fredericmazue

Quote:
En fait, l'entier renvoyé est en decimal

heu une méthode déclarée int read(), ça t'étonne que ça renvoie un nombre ?

Quote:
Le language java est le plus pratique que j'ai pu trouver

Sans blague ?
Tu ne dois pas en connaître beaucoup d'autres, ni avoir beaucoup cherché....
Quote:
(et certainement pas le plus adapté ....).

Le plus pratique mais pas le plus adapté. Comprenne qui pourra :lol: