lionkid007
Messages postés4Date d'inscriptiondimanche 17 février 2008StatutMembreDernière intervention22 mars 2008
-
19 févr. 2008 à 11:13
dms006gn
Messages postés12Date d'inscriptionlundi 28 février 2011StatutMembreDernière intervention16 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?
lionkid
Messages postés18Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention15 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.
dms006gn
Messages postés12Date d'inscriptionlundi 28 février 2011StatutMembreDernière intervention16 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)
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 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 ..."
dms006gn
Messages postés12Date d'inscriptionlundi 28 février 2011StatutMembreDernière intervention16 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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
dms006gn
Messages postés12Date d'inscriptionlundi 28 février 2011StatutMembreDernière intervention16 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
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 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 ..."