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

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
4 janv. 2011 à 19:46
Salut,

Ta proposition sur le readString (ou plutôt readLine) est valable dans certains cas mais à éviter le plus possible... ok, tu auras des chaînes de char cependant si tu te focalises sur les \r\n pour arrêter ta lecture, comment fais-tu pour des trames binaires?

Si tu reçois simplement une trame style
|4 bytes header|4bytes length| N bytes data|

Ici la partie 3 (les datas) peut être formatée comme suit "hello\r\nworld!" si tu fais un readline tu n'as pas la suite de ta trame ("world!") et tu dois soit :
- faire une re lecture en attendant la prochaine trame contenant un \r\n et ensuite analyser que tu as dans ta lecture un bout de la précédente...
- faire un autre type de lecture pour compléter... read(), read(byte[], offset, len), etc... le tout en te basant sur le champ length de ton ancienne trame...

Autre point important est, qu'il ne faut pas oublier que ta lecture dans un byte et celle dans un string n'est pas forcément la même.
String objet composé d'une suite de char qui sont codés (en java) sur 2 octets, alors qu'un byte reste sur 1 octet, donc( à mon sens) il est préférable de garder les conversions de type (bytes vers string/bytes faire structure de données, etc...) à plus haut niveau.





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

OoWORAoO
0
PY01A0080 Messages postés 24 Date d'inscription mardi 21 novembre 2006 Statut Membre Dernière intervention 15 mars 2011 1
6 janv. 2011 à 10:45
Salut à tous,

je vous remercie de votre participation à ce thread que je n'ai toujours pas résolu car l'appareil avec le port série en question n'est plus à ma disposition, donc j'attends d'en avoir un autre pour pouvoir continuer mon code.

J'aurai voulu conclure rapidement ce code avec lequel je commençais à m'embrouiller un peu mais grace à vous j'ai quand même pu arriver à faire quelque chose càd: se connecter, ouvrir et écrire sur le port série en java.
Par contre je ne suis pas arrivé à récupérer la trame de mon appareil ce qui était le but de mon code.

Mais je reviendrai vers vous dès que j'ai l'appareil, je ne lache pas.

Bonne journéé à vous tous
ZEN(PY01A0080)
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
28 févr. 2011 à 16:12
fgh
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
28 févr. 2011 à 17:17
bonjour! je suis débutant en java et je dois faire un prog en java qui permet de lire un code EPC à travers une liaison rs232 sur un lecteur rfid. donc dans ma recherche je suis tombé sur vos posts qui correspondent exactement à mon problème. j'ai essayé le code que vous proposez mais sans succès pour l'instant.

package rfid;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
import com.sun.comm.Win32Driver;

/**

*/
public class RS232
{
private static final String appName = "code EPC"; // Application name that request opening the serial port.
private static final int openTimeOut = 5000; // 5seconds.
private CommPortIdentifier portId;
private DataInputStream in;
private PrintWriter out;
private SerialPort serialPort;

private static final int databits = SerialPort.DATABITS_8; // RS-232 configuration
private static final int stopbit = SerialPort.STOPBITS_1; // RS-232 configuration
private static final int parity = SerialPort.PARITY_NONE; // RS-232 configuration
private static final int baudrate = 115200; // RS-232 configuration
/**
* Constructor
* @param com the communication port to open
* @lionkid
*/
public RS232(String com, boolean listAvailablePorts)
{
Win32Driver w32Driver = new Win32Driver();
w32Driver.initialize();

try
{
// Listing or not available serial and parallel ports found...
if(listAvailablePorts) System.out.println(availableSerialCommPorts());//on affiche la liste de tous les ports dispo

// Opening com port...
System.out.println("Trying to open serial port '" + com + "'...");
portId = CommPortIdentifier.getPortIdentifier(com);//obtenir l'identifiant du port serie
serialPort = (SerialPort) portId.open(appName, openTimeOut);//on ouvre le port correspondant puis on le caste
System.out.println("Successfully opened serial port '" + serialPort.getName() + "'!");

// Setting the serial connection as requested...
serialPort.setSerialPortParams(baudrate, databits, stopbit, parity);//affiche les params du port serie

in = new DataInputStream(serialPort.getInputStream());//initialisation du port d'entrée
out = new PrintWriter(serialPort.getOutputStream());//initialisation du port de sortie
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.exit(1); // sortie de l'appli
}
}

/**
* Read input stream through the RS-232 protocol
* (from the serial or parallel communication port)
* @lionkid
*/
public char read()
{
try
{
return in.readChar();
}
catch (IOException e)
{
System.out.println("Error when trying to read! "+e.getMessage());
System.exit(1); // Exit application! Adapt if needed!
}
return '0'; // Returns the '0' char caracter if reading fails
}

/**
* Send a message through the serial port
* @param sendMsg
* @lionkid
*/
public void send(String sendMsg)
{
try
{
out.write(sendMsg);
out.flush();
}
catch(Exception e)
{
System.out.println("Is port available and opened?\n"+e.getMessage());
System.exit(1); // Exit application! Adapt if needed!
}
}

/**
* Close serial connection
* @param none
* @return
* @lionkid
*/
public void closeConnection()
{
try
{
in.close();
out.close();
}
catch (IOException e)
{
System.out.println("Cannot open and / or close serial connection!Details:\n"+e.getMessage());
System.exit(1); // Exit application! Adapt if needed!
}
}

/**
* List all the available serial and parallel communication ports
* @return the list of all available serial and parallel communication ports.
* @lionkid & Twinuts
*/
public String availableSerialCommPorts()
{
System.err.println("Searching...");
String list = "";
Enumeration<Object> portList = CommPortIdentifier.getPortIdentifiers();

if (portList == null) // port(s) not found
{
System.err.println("No communication port detected!"); // notify it in the console
return null;
}
else // port(s) found
{
System.err.println("Detected serial communication ports !\nFound:\n");
while (portList.hasMoreElements())
{
portId = (CommPortIdentifier) portList.nextElement(); // get the found port
list += portId.getName()+"\n"; // add it in the String list
}
return list; // Return the full list
}
}
public byte[] readBytes() {
try {
byte buffer[] = new byte[30];
int n=0, offset=0, i=0;
while(true) {
i = in.available();
n = in.read(buffer, offset, i);
if (n<=0 || n == i) break;
offset+=n;
}
return buffer;
} catch (IOException e) {
return null;
}

}
/**
* Typical example of use of the RS232 class
* @param args
* @lionkid & Twinuts
*/
public static void main(String args[])
{
RS232 example = new RS232("COM1", true); // List all the available and found port com and try opening "COM1".
example.send("02 00 08 00 00 00 08 00 01 AA 55 00 00 28 68"); // Send the request string through the RS-232
System.out.println("test write Ok");
byte[] buffer = example.readBytes();
if(buffer == null)
System.err.println("Read error");
else {
System.out.println(new String (buffer, 0, buffer.length));
System.out.println("test read Ok");
}

//example.read();
// System.out.println("Received message = '"+example.read()+"'"); // Get the message sent by the remote device through the RS-232 protocol.
example.closeConnection(); // Close the connection.
}

}

Voici ce que j'obtiens en sortie:

Searching...
Detected serial communication ports !
COM1
Found:
LPT1

LPT2

Trying to open serial port 'COM1'...
Successfully opened serial port 'COM1'!
test write Ok

test read Ok

Si vous remarquez bien je n'arrive pas à lire le code EPC qui m'intéresse. je suis vraiment en galère merci d'avance de vos réponses!!
0

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

Posez votre question
lionkid Messages postés 18 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 15 mars 2011
28 févr. 2011 à 21:47
Bonjour 'dms006gn'.

Avant toute chose, éssaie d'utiliser les balises prévues pour le code Java stp, cela améliore la lisibilité, évite les erreurs et permet de trouver un éventuel probleme plus vite. Merci d'avance.

Autrement et pour en revenir à ton sujet, première chose, vérifie la qualité de ton raccordement au port série et effectue un test basique de com. Ensuite, vérifie la configuration programmée pour dialoguer à travers ton port série, c'est-à-dire ceci :

private static final int databits = SerialPort.DATABITS_8; // RS-232 configuration
private static final int stopbit = SerialPort.STOPBITS_1; // RS-232 configuration
private static final int parity = SerialPort.PARITY_NONE; // RS-232 configuration
private static final int baudrate = 115200; // RS-232 configuration 


Les précédents paramètres sont-ils configurés tels que tu le souhaites ?


Ensuite le code ci-dessous me paraît correct (prendre en compte les commentaires),

public byte[] readBytes() {
try {
byte buffer[] = new byte[30]; // Es-tu sûr qu'un tableau de 30 byte est suffisant ?
int n=0, offset=0, i=0;
while(true) {
i = in.available();
n = in.read(buffer, offset, i);
if (n<=0 || n == i) break;   // S'il n'y a plus rien à lire ou que tout a été lu pourquoi ne pas faire un "return buffer"? NB : J'aurai mis : n == -1
offset+=n;
}
return buffer;               // Devient inutile si la remarque précédente est prise en compte.
} catch (IOException e) {
return null;                 // Faire attention au fait que lorsque tu vas faire ton "new String(buffer, 0, buffer.length)" cela ne te fasse pas péter une exception
} 


Enfin, as-tu essayé deux (ou plusieurs) tentatives de lecture successives ?

byte[] buffer1 = example.readBytes();
if(buffer1== null) System.err.println("Read error");
else System.out.println("Lecture = "+new String (buffer1, 0, buffer1.length));

byte[] buffer2 = example.readBytes();
if(buffer2 == null) System.err.println("Read error");
else System.out.println("Lecture = "+new String (buffer2, 0, buffer2.length));
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
3 mars 2011 à 11:06
salut 'lionkid'
private static final int databits = SerialPort.DATABITS_8; // RS-232 configuration
private static final int stopbit = SerialPort.STOPBITS_1; // RS-232 configuration
private static final int parity = SerialPort.PARITY_NONE; // RS-232 configuration
private static final int baudrate = 115200; // RS-232 configuration 


Les précédents paramètres sont-ils configurés tels que tu le souhaites ?



oui les paramètres configurés sont donnés par le lecteur rfid


public byte[] readBytes() {
try {
byte buffer[] = new byte[30]; // Es-tu sûr qu'un tableau de 30 byte est suffisant ?
int n=0, offset=0, i=0;
while(true) {
i = in.available();
n = in.read(buffer, offset, i);
if (n<=0 || n == i) break;   // S'il n'y a plus rien à lire ou que tout a été lu pourquoi ne pas faire un "return buffer"? NB : J'aurai mis : n == -1
offset+=n;
}
return buffer;               // Devient inutile si la remarque précédente est prise en compte.
} catch (IOException e) {
return null;                 // Faire attention au fait que lorsque tu vas faire ton "new String(buffer, 0, buffer.length)" cela ne te fasse pas péter une exception
} 



oui car je connais la longueur des données que je vais lire (25 octets pour un code EPC)

en gros tu as raison le code marche, j'arrive à lire la trame de réponse du lecteur. Mais ce n'est pas la bonne trame, c'est une trame d'erreur. Je pense avoir trouvé le problème, ça vient de la requête que j'envoie:

example.send("02 00 08 00 00 00 08 00 01 AA 55 00 00 28 68"); // Send the request string 


en fait je dois envoyer une trame composée de ces octets ci-dessus. donc je recherche une méthode pour envoyer cette trame sous forme de chaine de caractères (chaque caractère doit correspondre à un octet) car le lecteur doit recevoir exactement ces mêmes données dans le bon ordre.

Donc ma question est: existe t - il une méthode qui convertit de l'hexa ou du décimal en caractères?

PS: je m'excuse de ne pas avoir mis des balises dans le premier post.
bonne journée à toi et encore merci de ton aide
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
3 mars 2011 à 12:37
Salut,

Si tu prends ta chaîne "02 00 08 00 00 00 08 00 01 AA 55 00 00 28 68" en base tu peux faire un truc genre :
String s = "02 00 08 00 00 00 08 00 01 AA 55 00 00 28 68";
String [] split = s.split(" ");
String result = "";
for(String str : split) {
  if(str.equals("00")) result +"0"; // 00 0 == \0 == null - tu peux mettre autre chose ou rien si tu veux
  else if(str.equals("02")) result +"2"; // 02 correspond au début de texte (cf table ascii) - tu peux mettre autre chose ou rien si tu veux
  else result += (char)Integer.parseInt(str, 16); // 16 pour la base 16 (hex) sinon autre voir rien pour la base 10
}
System.err.println(result);






------------------------------------
"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
3 mars 2011 à 15:36
salut 'Twinuts'
La trame que je dois envoyer est la suivante: "020008000000080001AA5500002868". ce n'est pas des caractères, c'est une chaine d'octets.Désolé d'avoir mis des espaces entre les octets. Donc il faut que je la convertisse en chaine de caractères avant de la donner en argument à la méthode "send".
j'espère avoir été plus clair
un grand MERCI OoWORAoO
0
lionkid Messages postés 18 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 15 mars 2011
3 mars 2011 à 20:55
Salut,

Twinuts a pourtant répondu à :

Donc ma question est: existe t - il une méthode qui convertit de l'hexa ou du décimal en caractères?


Tu peux faire :

String maChaine = ""020008000000080001AA5500002868";
char[] tab = maChaine.toCharArray();
char car;
for(int i 0; i < tab.length; i++) car (char)Integer.parseInt(tab[i]+"", 16);


A+

PS : Tu peux alors envoyer le 'car' via un send dans la boucle 'for'.
0
PY01A0080 Messages postés 24 Date d'inscription mardi 21 novembre 2006 Statut Membre Dernière intervention 15 mars 2011 1
9 mars 2011 à 12:07
Bonjour,

voilà je reviens vers vous après un certain temps car j'ai de nouveau mon appareil pour continuer le test.
Donc d'après le code que j'ai avec moi, quand je le lance, même s'il n'y a pas d'appareil branché sur le port série, il me dit :
"run:
Found : COM6
Searching...
Found : COM7
Detected serial communication ports !
Found : COM10

Found : COM11
Found : COM12
Found : COM13
Found : COM14
Found : COM20
Found : COM21
Found : COM22
Found : COM3
Found : COM1
Found : LPT1
Found : LPT2
Found : COM6
Found : COM7
Found : COM10
Found : COM11
Found : COM12
Found : COM13
Found : COM14
Found : COM20
Found : COM21
Found : COM22
Found : COM3
Found : COM1
Found : LPT1
Found : LPT2
COM6
COM7
COM10
COM11
COM12
COM13
COM14
COM20
COM21
COM22
COM3
COM1
LPT1
LPT2
COM6
COM7
COM10
COM11
COM12
COM13
COM14
COM20
COM21
COM22
COM3
COM1
LPT1
LPT2

Trying to open serial port 'COM1'...
Successfully opened serial port 'COM1'!
test ecriture OK
test lecture OK



Est-ce-normal?

il faudrait que je lui dise d'arrêter d'ouvrir s'il ne trouve pas d'appareil branché sur com1.

Par contre, la commande que je veux lui envoyer est "0R0" c'est donc une chaine de caractère.
Ai-je-besoin de le convertir sous une forme pour que mon appareil le prenne en compte.

parce que même appareil branché, j'ai toujours le même résultat.
D'habitude sur Hyper Terminal, aprés 0R0 je fais aussi retour chariot.
Dois-je ajouter une deuxième ligne comme "/n/r"?
Merci



ZEN
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 mars 2011 à 12:42
Salut,


Est-ce-normal?

Humpf comment dire... Il try un open de COM1 qui est OK, il try un write sur COM1 qui est OK et enfin il try un read sur COM1 qui est ok... que dire de plus ?


il faudrait que je lui dise d'arrêter d'ouvrir s'il ne trouve pas d'appareil branché sur com1.

Bah... adapte le code ô_O


Par contre, la commande que je veux lui envoyer est "0R0" c'est donc une chaine de caractère.
Ai-je-besoin de le convertir sous une forme pour que mon appareil le prenne en compte.

Pas spécialement, si tu dois envoyer des trames String pas besoin.



parce que même appareil branché, j'ai toujours le même résultat.
D'habitude sur Hyper Terminal, aprés 0R0 je fais aussi retour chariot.
Dois-je ajouter une deuxième ligne comme "/n/r"?

Bah idéalement oui avec un bon vieux CRLF (qui n'est pas /n/r mais \r\n - attention à l'ordre).


------------------------------------
"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
11 mars 2011 à 10:57
Bonjour à tous!
Après plusieurs jours de reflexion, je ne suis toujours pas à arriver à extraire l'information voulue (le code EPC du tag). Malgré tout j'ai réussi à envoyer des trames et le lecteur me répond parfaitement. Du coup j'ai installé Portmon pour voir exactement le flux de données que j'envoie et que je reçois sur le port série. Et là j'ai découvert qu'il y'a des octets qui sont rajoutés sur la trame que j'envoie. Et je ne sais pas d'où ça vient. C'est pourquoi le lecteur ne me renvoie pas le code EPC.
je me suis procuré du logiciel de lecture de tags et j'ai comparé les flux de données.


Avec le logiciel de lecture SesPro


0	09:52:38	SESProEPC.exe	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
1	09:52:38	SESProEPC.exe	IOCTL_SERIAL_SET_QUEUE_SIZE	Serial0	SUCCESS	InSize: 65534 OutSize: 65534	
2	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
3	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
4	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
5	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
6	09:52:38	SESProEPC.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 115200	
7	09:52:38	SESProEPC.exe	IOCTL_SERIAL_CLR_RTS	Serial0	SUCCESS		
8	09:52:38	SESProEPC.exe	IOCTL_SERIAL_CLR_DTR	Serial0	SUCCESS		
9	09:52:38	SESProEPC.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
10	09:52:38	SESProEPC.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:8a ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
11	09:52:38	SESProEPC.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:0 Replace:0 XonLimit:16383 XoffLimit:16383	
12	09:52:38	SESProEPC.exe	IOCTL_SERIAL_SET_TIMEOUTS	Serial0	SUCCESS	RI:0 RM:2000 RC:2000 WM:100 WC:1000	
13	09:52:38	SESProEPC.exe	IOCTL_SERIAL_SET_WAIT_MASK	Serial0	SUCCESS	Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL 	
14	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_MODEMSTATUS	Serial0	SUCCESS		
15	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_MODEMSTATUS	Serial0	SUCCESS		
16	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_MODEMSTATUS	Serial0	SUCCESS		
17	09:52:38	SESProEPC.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 15: 02 00 08 00 00 00 08 00 01 AA 55 00 00 28 68 	
18	09:52:38	SESProEPC.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
19	09:52:38	SESProEPC.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
20	09:52:38	SESProEPC.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 5: 02 00 17 00 00 	
21	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
22	09:52:38	SESProEPC.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
23	09:52:38	SESProEPC.exe	IOCTL_SERIAL_WAIT_ON_MASK	Serial0	SUCCESS		
24	09:52:38	SESProEPC.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 25: 00 01 00 11 01 0C 00 00 07 0C 26 12 07 00 00 1A 88 8C 00 00 01 08 00 A7 39




Avec le code java


97	10:51:13	java.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 115200	
98	10:51:13	java.exe	IOCTL_SERIAL_SET_RTS	Serial0	SUCCESS		
99	10:51:13	java.exe	IOCTL_SERIAL_SET_DTR	Serial0	SUCCESS		
100	10:51:13	java.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
101	10:51:13	java.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:4e ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
102	10:51:13	java.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:1 Replace:42 XonLimit:16 XoffLimit:1024	
103	10:51:13	java.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 16: 02 00 08 00 00 00 08 00 01 C2 AA 55 00 00 28 68 	
104	10:51:13	java.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
105	10:51:13	java.exe	IOCTL_SERIAL_GET_COMMSTATUS	Serial0	SUCCESS		
106	10:51:13	java.exe	IRP_MJ_READ	Serial0	SUCCESS	Length 13: 02 00 06 00 00 00 01 00 00 00 03 21 83 	


Si quelqu'un a une idée quelle qu'elle soit, je suis preneur. Merci d'avance! Et bonne journée!
0
PY01A0080 Messages postés 24 Date d'inscription mardi 21 novembre 2006 Statut Membre Dernière intervention 15 mars 2011 1
11 mars 2011 à 11:50
ok? Cela serait de voir ton code parce que moi je n'obtiens aucune réponse de mon appareil quand je lui envoie une commande.

la commande envoyée est: "0R0"
puis : "/n/r"

doit-on convertir en binaire ou..?
il fait tout mais pas ce que je veux.
salut

ZEN
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
14 mars 2011 à 15:18
slt PY01A0080
voici le code que j'ai utilisé(provenant en grande partie de Lionkid et OoWORAoO que je remercie beaucoup):
package stage;



import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
import com.sun.comm.Win32Driver;
import java.lang.*;
/**

 */
public class RS232
{
private static final String appName = "lire code EPC";				// Application name that request opening the serial port.
private static final int openTimeOut = 5000; 					// 5seconds.
        

        
private CommPortIdentifier portId;
private DataInputStream in;
private PrintWriter out;
private SerialPort serialPort;

private static final int databits = SerialPort.DATABITS_8;			// RS-232 configuration
private static final int stopbit = SerialPort.STOPBITS_1;			// RS-232 configuration
private static final int parity = SerialPort.PARITY_NONE;			// RS-232 configuration
        private static final int flowctrl_out = SerialPort.FLOWCONTROL_XONXOFF_OUT;
        //private static final int flowctrl_in = SerialPort.FLOWCONTROL_XONXOFF_IN;
private static final int baudrate = 115200;					// RS-232 configuration
/**
 * Constructor
*/
       

public RS232(String com, boolean listAvailablePorts)
{
Win32Driver w32Driver = new Win32Driver();
w32Driver.initialize();

try
{
                        int n;
// Listing or not available serial and parallel ports found...
if(listAvailablePorts) System.out.println(availableSerialCommPorts());//on affiche la liste de tous les ports dispo

// Opening com port...
System.out.println("Trying to open serial port '" + com + "'...");
portId = CommPortIdentifier.getPortIdentifier(com);//obtenir l'identifiant du port serie
serialPort = (SerialPort) portId.open(appName, openTimeOut);//on ouvre le port correspondant puis on le caste
System.out.println("Successfully opened serial port '" + serialPort.getName() + "'!");

// Setting the serial connection as requested...
serialPort.setSerialPortParams(baudrate, databits, stopbit, parity);//configure les params du port serie
                        //serialPort.setFlowControlMode(flowctrl_in);
                        serialPort.setFlowControlMode(flowctrl_out);
                        n=serialPort.getFlowControlMode();
                        System.out.println(n);

                        in = new DataInputStream(serialPort.getInputStream());//initialisation du port d'entrée
                        out = new PrintWriter(serialPort.getOutputStream());//initialisation du port de sortie
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.exit(1);					// sortie de l'appli
}
}



        public void sendRst()
{
try
{
                        int data [] = {0x02,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x23,0x7f,0x55,0x00,0x00,0xf7,0xf2};
                        for(int j=0; j<data.length; j++){
                            out.write(data[j]);
                                                    
                        }
                out.flush();//on vide le buffer
                        System.out.println("rst OK\n");
}
catch(Exception e)
{
System.out.println("Is port available and opened?\n"+e.getMessage());
System.exit(1);
}
}


public void sendSettings()
{
try
{
int  data [] = {0x02,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x21,0xAA,0x55,0x00,0x40,0x00,0x32,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7,0x5};
                        for(int i=0; i< data.length; i++)
                        {
                            out.write(data[i]);
                          
                        }
                                        
                out.flush();//on vide le buffer
                        System.out.println("settings OK\n");
}
catch(Exception e)
{
System.out.println("Is port available and opened?\n"+e.getMessage());
System.exit(1);
}
}


/**
 * Send a message through the serial port
**/
public void sendMsg()
{
try
{
int  data [] = {0x02,0x00,0x08,0x10,0x00,0x00,0x08,0x00,0x01,0xA,0x55,0x00,0x00,0x28,0x68};
                        for(int j=0; j<data.length; j++){
                            out.write(data[j]);
                            System.out.print(data[j]+ " ");
                        }

                       
                        out.flush();//on vide le buffer
                        System.out.println("msg OK\n");
}
catch(Exception e)
{
System.out.println("Is port available and opened?\n"+e.getMessage());
System.exit(1);					
}
}

/**
 * Close serial connection
*/

           public void closeConnection()
{
try
{
in.close();
out.close();
}
catch (IOException e)
{
System.out.println("Cannot open and / or close serial connection!Details:\n"+e.getMessage());
System.exit(1);					
}
}

/**
 * List all the available serial and parallel communication ports
 * @return the list of all available serial and parallel communication ports.
  	 */
public String availableSerialCommPorts()
{
System.err.println("Searching...");
String list = "";
Enumeration portList = CommPortIdentifier.getPortIdentifiers();

if (portList == null) 							// port(s) not found
{
System.err.println("No communication port detected!");		// notify it in the console
return null;
}
else									// port(s) found
{
System.err.println("Detected serial communication ports !\nFound:\n");
while (portList.hasMoreElements())
{
portId = (CommPortIdentifier) portList.nextElement();	// get the found port
list += portId.getName()+"\n";				// add it in the String list
}
return list;							// Return the full list
}
}
       public byte[] readBytes() {
        try {
            byte buffer[] = new byte[25];
            int n=0, offset=0, i=0;
            while(true) {
                i = in.available();//retourne le nb d'octets qui peut être lus
                System.out.println("octets disponibles : " + i);
                n = in.read(buffer, offset, i); //nb d'octets actuellement lus
            if (n<=0 || n == i) break;
                 offset+=n;
                        }
                 return buffer;

            } catch (IOException e) {
    return null;
        }
    }

          
/**
 *Main function
 */
public static void main(String args[])
{
RS232 example = new RS232("COM1", true);	// List all the available and found port com and try opening "COM1".


                example.sendRst();
                for (int i =0; i<200000000; i++) {
                           i=i;
                   }
                byte[] buffer = example.readBytes();
                for (int i =0; i<buffer.length; i++) {
                System.out.print(buffer[i]+ " ");
                    }
                
                example.sendSettings();
                for (int i =0; i<200000000; i++) {
                           i=i;
                        }
                byte[] buffer1 = example.readBytes();
                for (int i =0; i<buffer1.length; i++) {
                         System.out.print(buffer1[i]+ " ");
                    }


                example.sendMsg();
                for (int i =0; i<200000000; i++) {
                           i=i;
                        }
                byte[] buffer2 = example.readBytes();
                for (int i =0; i<buffer2.length; i++) {
                System.out.print(buffer2[i]+ " ");
                    }
                System.out.println("");

      
                       
example.closeConnection();
        }


}


Je vois d'où viens mon erreur mais j'ai pas encore trouvé la solution. D'après ce que j'ai compris, les octets envoyés ne doivent pas être sup à 0x7F (127 en decimal) sinon il me rajoute un octet de plus pour pouvoir coder la valeur.
bne journée!!!
0
dms006gn Messages postés 12 Date d'inscription lundi 28 février 2011 Statut Membre Dernière intervention 16 mars 2011
15 mars 2011 à 10:42
Salut Twinuts et Lionkid,
je me redirige vers vous parceque vous êtes mon dernier espoir, je dois rendre ce travail ce jeudi à 10h30.je suis complètement perdu et j'ai plus de solution... Donc SVP aidez moi!!!
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
15 mars 2011 à 10:56
Salut,

Sans ton précédent poste tu dis :

Je vois d'où viens mon erreur mais j'ai pas encore trouvé la solution. D'après ce que j'ai compris, les octets envoyés ne doivent pas être sup à 0x7F (127 en decimal) sinon il me rajoute un octet de plus pour pouvoir coder la valeur.

Comment dire... assure toi simplement de ne pas envoyer de valeur sup à x7F ...


Question :
c'est quoi ce bout de code totalement immonde ?
for (int i =0; i<200000000; i++) {
  i=i;
}



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

OoWORAoO
0
PY01A0080 Messages postés 24 Date d'inscription mardi 21 novembre 2006 Statut Membre Dernière intervention 15 mars 2011 1
15 mars 2011 à 10:58
Bonjour,

j'aimerai tellement participer à ce thread mais je ne peux aucun test avec prog car pas d'appareil port série sous la main.
faut que j'attende d'en avoir au travail.

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

Merci de venir à ma rescousse...
Comment dire... assure toi simplement de ne pas envoyer de valeur sup à x7F ...


C'est que la trame que je dois envoyer contient des octets supérieurs à x7f, par exemple xAA. voici un exemple de trame que je dois envoyer:
int  data [] = {0x02,0x00,0x08,0x10,0x00,0x00,0x08,0x00,0x01,0xAA,0x55,0x00,0x00,0x28,0x68};

donc je ne sais comment faire...


Question : 
c'est quoi ce bout de code totalement immonde ? 
Code Java :
for (int i =0; i<200000000; i++) {
  i=i;
}


j'ai mis une tempo après chaque envoi de données pour laisser le temps au lecteur de les traiter, avant de faire une lecture du buffer
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
15 mars 2011 à 17:31
Salut,


C'est que la trame que je dois envoyer contient des octets supérieurs à x7f, par exemple xAA. voici un exemple de trame que je dois envoyer:

Essaye avec une autre configuration de ton device




j'ai mis une tempo après chaque envoi de données pour laisser le temps au lecteur de les traiter, avant de faire une lecture du buffer

Au risque d'être désagréable ce n'est pas une tempo ça... une tempo se fait avec un slee() pas avec une vielle boucle for qui fait mouliner une application pour rien


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

OoWORAoO
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
15 mars 2011 à 17:32
Re,

je voulais écrire 'sleep' pas 'slee'




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

OoWORAoO
0
Rejoignez-nous