Port serie RS232 recuperer une frame ...

Port serie RS232 recuperer une frame ... - Java - Programmation

Marsh Posté le 23-03-2006 à 10:47:33    

Salut a tous,
voila j ai un probleme de port serie... je m'arrache les cheveux depuis plusieurs semaines sans resultat.
Je dois recuperer une frame venant d'un chronometre relié a mon ordi via le port serie(RS232).
 
J'ai instaler les api et meme créé un programme pour voir les port serie, tt marche les ports serie sont reconnu, mais je travail sur le port serie COM1 et la pas moyen de recuperer quelque chose.
 
Voici les parametres du chrono :
Liaison serie Type RS232 sans controle de flux. 1200bauds, 8 bit, 1 stop bit, pas de parité.
 
Exemple de Trame envoyé par le Chronometre : (9 octets par frame)  
FA+00+11+12+02+24+96+EE+OD
FA = debut de trrame  
OD = Fin de trame
Le reste sont des données de chronometrage...
 
Voila je voudrais savoir si quelqu'un pourrais m'aider a trouver un code permettant de recuperer les données du chrono via le port serie RS232, en sachant que ses donnée peuvent arriver n'importe quand lorsqu'on a effectué la liaison au COM1.
 
Merci a tt ceux qui pourront m'aider car j'ai peur de finir chauve, en plus je ne suis pas trés experimenté en Java...

Reply

Marsh Posté le 23-03-2006 à 10:47:33   

Reply

Marsh Posté le 23-03-2006 à 14:23:09    

Sa y es j'ai reussi a faire fonctionner le port serie !
Je ne finirais pas chauve !
 
voila le code pour ceux qui serait dans le meme cas que moi ...
 

Code :
  1. package portserie;
  2. import javax.comm.*;
  3. import java.io.*;
  4. import java.util.*;
  5. /*
  6. Cette classe permet de tester les ports séries disponibles
  7. en les listant puis en créant un stream d'entrée et de sortie
  8. */
  9. public class test{
  10. CommPortIdentifier portId;
  11. BufferedReader in;
  12. PrintWriter out;
  13. SerialPort serialPort;
  14. /*
  15. Constructeur de la classe test qui prend en paramètre le port série à utiliser.
  16. Dans un premier temps on liste les ports disponibles sur le pc
  17. */
  18. public test (String com)
  19. {
  20. System.out.println("liste des ports série disponibles:" );
  21. listePortsDispo();
  22. try
  23. {
  24. // ouverture du port série:
  25. portId=CommPortIdentifier.getPortIdentifier(com);
  26. serialPort=(SerialPort)portId.open("Envoi",2000);
  27. // on sélectionne tous les paramètres de la connexion série:
  28. serialPort.setSerialPortParams(1200,SerialPort.DATABITS_8,
  29.             SerialPort.STOPBITS_1,
  30.             SerialPort.PARITY_NONE);
  31. System.out.println("Ouverture du port "+com);
  32. // pour lire avec des streams:
  33. in=new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
  34. // Teste de lecture sur le port série
  35. String codeBarre = new String();
  36. try {
  37.  //lecture du buffer et affichage
  38.  codeBarre = (String) in.readLine();
  39.  System.out.println(codeBarre);
  40. } catch (IOException e) {
  41. }
  42. in.close();
  43. }
  44. catch (Exception e)
  45. {
  46. e.printStackTrace();
  47. }
  48. }//fin constructeur
  49. public void listePortsDispo()
  50. {
  51. System.err.println("recherche..." );
  52. Enumeration portList=CommPortIdentifier.getPortIdentifiers();
  53. if (portList==null)
  54. {
  55. System.err.println("Aucun port de communication détecté" );
  56. return;
  57. }
  58. while (portList.hasMoreElements())
  59. {
  60. portId=(CommPortIdentifier)portList.nextElement();
  61. System.out.println("* "+portId.getName());
  62. } //fin while
  63. } //fin de la methode listePortsDispo()
  64. /*
  65. Methode main qui permet de tester notre classe de tester en ouvrant une connexion sur le port COM1.
  66. */
  67. public static void main(String args[])
  68. {
  69. new test ("COM1" );
  70. }//fin du main
  71. }//fin de la classe

Reply

Marsh Posté le 24-03-2006 à 11:19:13    

sinon, à tout hasard, un lien qui m'a pas mal servie sur l'utilisation du port série via javax.com:
 
http://christophej.developpez.com/ [...] /javacomm/
 
Un trés bon tuto trés bien fais

Reply

Marsh Posté le 26-03-2006 à 10:45:15    

Bonjour
 
lors du telechargement de cette librairie, il est ecrit qu'elle est disponible pour les machines solaris et linux. Marche - t- elle sous windows? si non, connaissez vous une librairie JAVA pour utiliser le port serie (ou le bluetooth) sous windows?
 
Merci de votre aide.
 
Hibougarou

Reply

Marsh Posté le 03-04-2006 à 21:24:05    

Bonjour,
 
J'ai récupéré le code proposé par  ' wfs-tibal ', que je remercie d'ailleurs  :hello:.
Mon problème après l'exécution, est qu'il n'arrive même pas à lister les ports de mon PC !
Je ne connecte rien sur le port COM1 de mon PC car je ne veux, pour le moment, que lister les ports dispo de mon PC ! Mais sans succès... :fou:  :fou:  :fou:  
 
Ma fenêtre console m'affiche ça :

Code :
  1. liste des ports série disponibles:
  2. recherche...
  3. Exception in thread "main" java.lang.NullPointerException
  4. at javax.comm.CommPortEnumerator.hasMoreElements(CommPortIdentifier.java:568)
  5. at ModeEvenement.listePortsDispo(ModeEvenement.java:77)
  6. at ModeEvenement.<init>(ModeEvenement.java:26)
  7. at ModeEvenement.main(ModeEvenement.java:92)


 :heink:  :heink:  
 
Merci de m'aider  :love:  :love:  
 
 

Reply

Marsh Posté le 05-04-2006 à 12:25:06    

D'aprés ton Exception, je dirais que tu travailles sur un liste vide.
 
voici le code que j'ai utilisé pour mon cas avec javax.comm
 
Ce code n'est pas brillant brillant, je l'ai fais quand je debuttait en java.
En esperant qu'il puisse vous être utile
 

Code :
  1. import javax.comm.*;
  2. import com.sun.comm.Win32Driver;
  3. import java.io.*;
  4. import java.util.*;
  5. public class CommunicationRail{
  6. private SerialPort sPort; //le port série   
  7. private CommPortIdentifier portId;//identifiant du port
  8. private Win32Driver w32Driver;
  9. private String port = "COM1";
  10. boolean autorisationCommunique = true;
  11. boolean communication;
  12. /**constructeur initialise le driver de la com et repertorie toutes les ports present sur l'ordinateur.
  13. ATTENTION si ce constructeur est appeller une deuxieme fois, les ports détecté s'ajouteront à ceux détéctés lors du premier appelle.  
  14. */
  15. public CommunicationRail(){
  16.  w32Driver = new Win32Driver();
  17.  w32Driver.initialize();
  18. }
  19. /**repertorie les ports serie utilisable par le rail.
  20. @return un tableau de string de tout les noms des ports que peut utiliser le rail.
  21. */
  22. public String[] getListePortRail(){
  23.  ArrayList tableauPortId = new ArrayList();
  24.  Enumeration listPort = CommPortIdentifier.getPortIdentifiers();
  25.  while( listPort.hasMoreElements()){
  26.   tableauPortId.add(listPort.nextElement());
  27.  }
  28.  int i;
  29.  for (i = 0; i<tableauPortId.size(); i++){
  30.   if ((((CommPortIdentifier)tableauPortId.get(i)).getPortType())!= CommPortIdentifier.PORT_SERIAL){
  31.    tableauPortId.remove(i);
  32.    i--;
  33.   }
  34.  }
  35.  i = tableauPortId.size();
  36.  String []listePortRail = new String[i];
  37.  CommPortIdentifier portId;
  38.  for (i = 0; i<tableauPortId.size(); i++){
  39.   portId = (CommPortIdentifier)tableauPortId.get(i);
  40.   listePortRail[i]= portId.getName();
  41.  }
  42.  return listePortRail;
  43. }
  44. }

Reply

Marsh Posté le 25-01-2008 à 15:27:05    

Pas de problème pour compiler, mais l'exécution (sous Linux) ne marche pas.
 
Quelques éléments de configuration :
 
java est installé dans le répertoire : /usr/lib/j2sdk1.4-sun/bin (donc version 1.4)
 
2 répertoires sur mon compte utilisateur :
- commapi : est le répertoire de la classe communication
- java est le répertoire contenant le programme de test ci-dessus
 
Depuis le répertoire java, la compilation marche en faisant :
javac -classpath ../commapi/jar test.java
 
Il a juste fallu utiliser la commande jar pour désarchiver le fichier .jar (que j'ai laissé dans son répertoire)
 
Jamais réussi à exécuter.
 
Quelques essais :
 
java test
Exception in thread "main" java.lang.NoClassDefFoundError: test (wrong name: portserie/test)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
        (...)
Normal, on n'a rien indiqué pour trouver les classes gérant le port série
 
java -classpath ../commapi/jar test
Exception in thread "main" java.lang.NoClassDefFoundError: test
(encore normal)
 
java -classpath ../commapi/jar:. test
Exception in thread "main" java.lang.NoClassDefFoundError: test (wrong name: portserie/test)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
        (...)
 
java -classpath .:../commapi/jar test
Exception in thread "main" java.lang.NoClassDefFoundError: test (wrong name: portserie/test)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
        (...)
 
java -classpath .:$HOME/commapi/jar test
idem
 
java -classpath .:../commapi/jar/com/sun/comm test
toujours pareil
 
Même problème en utilisant une variable d'environnement $classpath
 
Je ne sais plus comment faire pour faire tourner ce programme

Reply

Marsh Posté le 11-04-2010 à 11:58:23    

salut a tous ,  
wfs-tibal , je veux utiliser ton code pour reçu par le port serie ces données:
login = pika ; password = 1111  
normalement c'est ca lapartie a motifier  
# // pour lire avec des streams:
# in=new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
#
# // Teste de lecture sur le port série
#
# String codeBarre = new String();
# try {
#  //lecture du buffer et affichage
#  codeBarre = (String) in.readLine();
#  System.out.println(codeBarre);
# } catch (IOException e) {
# }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed