Test ecriture / Lecture en Java : Port Serie RS232

Résolu
lionkid007 Messages postés 4 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 22 mars 2008 - 19 févr. 2008 à 11:13
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011 - 16 mars 2011 à 12:56
Bonjour,

Je dois faire un programme permettant de communiquer sur le port serie RS232 en Java.
Je dois donc pouvoir lire et ecrire. J'ai bien regardé les différents fichiers dispo, mais j'arrive pas à faire ce que je veux.
J'ai relié la patte TX à RX de mon port série et je veux pouvoir avec mon programme java, afficher ce que j'ai envoyé via mon programme en java.
Je suis débutant en java et j'ai du mal...
Si vous pouviez m'aider, merci!!!!

Voilà le code que j'ai déjà utilisé :
import javax.comm.*;
import java.io.*;
import java.util.*;

/*
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)
{
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);

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

//pour lire et écrire avec des streams:
in=new BufferedReader(
new InputStreamReader(serialPort.getInputStream()));
out=new PrintWriter(serialPort.getOutputStream());

//Teste de lecture/ecriture sur le port série

String originalText="une chaine de caractere";
outputArray = originalText.getBytes( );
out.write ( outputArray, 0 , length );
int b = in.read()
in.close();
out.close();

}
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



PS : Quand j'ai essayé ce bout de code, j'ai des erreurs comme quoi : OutputArray et length ne sont pas définis?? Il faut faire un String OutputArray et un int length?

merci encore, A++

68 réponses

lionkid Messages postés 18 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 15 mars 2011
15 mars 2011 à 21:35
Salut, Twinuts a raison. Ce n'est pas comme ça qu'on fait une tempo.

Essaie directement avec la méthode statique : Thread.sleep(ms); // 'ms' de type int en milliseconde.

Je pense que la temporisation est très importante pour les périphériques série. J'avais (à l'époque où j'avais utilisé la Java Communication API) dû faire des temporisation de l'ordre de 400ms afin d'être sûr que ma requête soit convenablement traitée par le périphérique.

PS : la méthode jette une exception, faudra donc penser à la catcher.

A+ et bon courage.
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
16 mars 2011 à 09:47
Bonjour,

j'ai refait la tempo et j'ai utilisé la methode Thread.sleep(ms) en faisant un truc comme ça:

try{
                example.sendRst();

                Thread.sleep(100);//sleep for 100 ms

                byte[] buffer = example.readBytes();
                for (int i =0; i<buffer.length; i++) {
                System.out.print(buffer[i]+ " ");
                    }
                }
                catch(InterruptedException ie){

                System.out.println("Is port available and opened?\n"+ie.getMessage());
System.exit(1);
                }


Pour la config du device, je ne peux pas changer les paramètres car son protocole de commuication est figé. Donc j'aimerais savoir si c'est possible gerer les paramètres de la liaison serie comme par exemple augmenter la valeur max du buffer de sortie ( passer de x7F à xFF)

Ou si il y a autre une option...
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 mars 2011 à 10:50
Salut,

Bah il y a déjà un problème avec le type que tu utilises et ce que tu envois...
Je m'explique, en toute logique et aux vues du problème que tu as, ton device ne va faire que des lectures de bytes donc des données codées sur 1 octet.
Donc si tu utilises un write de int via la l'objet PrintWriter tu déportes le problème.
Pour rappel la méthode write n'effectue qu'une écriture d'un char (au format int), char qui est calé sur la table ASCII qui (de base) n’excède pas 127 décimal (0x7F en hexa) ce qui correspond à un type unsigned char (-128 to 127)


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
16 mars 2011 à 12:07
Salut Twinuts,

Ok ça veut dire que je dois utiliser un dataOutputStream pour la variable de sortie Out? Justement je ne vois d'autre méthode à part write de int pour écrire des donnees sur un octet. Est ce que tu peux me proposer une methode pour envoyer des octets (0 à 255)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 mars 2011 à 12:19
Re,

petite coquille dans mon précédent poste c'est pas "unsigned char (-128 to 127)" mais "signed char (-128 to 127)" que je voulais écrire :/

Sinon tu peux tester avec la classe DataOutputStream et la méthode writeInt



------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
16 mars 2011 à 12:32
Salut Twinuts

Je ne sais pas comment te remercier parce que c'est vraiment SUPER tu m'as guidé vers la solution. J'ai declaré la sortie en DataOutputStream et j'ai utilisé la methode write de int pour ecrire mes octets et c'est super le lecteur me repond parfaitement avec le code EPC à l'intérieur.
MERCIIIIII!!!!!! tout simplement
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 mars 2011 à 12:38
Salut,

bah content que tu sois enfin débloqué :), pour tes prochains codes fait très attention aux méthodes que tu utilises et retiens bien que ce n'est pas parce que la méthode prend un int en param qu'elle va écrire un int ;)




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
16 mars 2011 à 12:56
Re

OK je retiendrai la leçon :)
0
Rejoignez-nous