RS 232 [Résolu/Fermé]

didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 12 août 2006 à 18:25 - Dernière réponse : Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention
- 22 août 2006 à 13:47
bonjour a tous.


Voila quelques jour que j'ai realiser un petit montage (lecteur de puces RFID) me permetant de recuperer sous la forme de 11 octets les donnees enregistrer dans la puce (dons le code identifiant) et ce sur n'importe quel port serie RS 232 d'un pc.
apres une recherche aprofondie sur internet et sur le site j'ai ete decus du peu de resultat explicant comment "cree une liaison RS 232, recuperer des donnees sur le prot RS 232 ...".

par concequent, je m'en refaire a vous pour m'expliquer tous cela.

je vous remerci par avance.
Afficher la suite 

13 réponses

Meilleure réponse
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 12 août 2006 à 20:17
3
Merci
Salut,

tu utilise quelle techno pour faire ta comme RS232?

si tu utilise celle de sun voici un petit exemple :
SerialConnectionException represente une exception herité de Exception

public final class RS232{

    private CommPortIdentifier portId = null;
    private SerialPort sPort = null;
    private boolean open = false;
    private OutputStream os = null;
    private InputStream is = null;
    private boolean available = true;
    private int timeoutRx = 0;

   
    protected RS232(String deviceName, int bitRate, int dataBits,
            int stopBits, int hanshake, int timeoutRx, int timeoutTx) {
        if (open) return;
        try {
            portId = CommPortIdentifier.getPortIdentifier(deviceName);
        } catch (NoSuchPortException e) {
            try {
                throw new SerialConnectionException(e.getMessage());
            } catch (SerialConnectionException e1) {
                return;
            }
        }

        try {
            sPort = (SerialPort) portId.open("MonRS232", timeoutTx);
        } catch (Exception e) {
            try {
                throw new SerialConnectionException(e.getMessage());
            } catch (SerialConnectionException e1) {
                return;
            }
        }

        try {
            setConnectionParameters(bitRate, dataBits, stopBits, hanshake);
        } catch (SerialConnectionException e) {
            sPort.close();
            return;
        }

        sPort.notifyOnFramingError(false);
        sPort.notifyOnOverrunError(false);
        sPort.notifyOnParityError(false);
        sPort.notifyOnDataAvailable(true);
        sPort.notifyOnOutputEmpty(true);
        sPort.notifyOnBreakInterrupt(true);

        try {
            sPort.enableReceiveTimeout(timeoutRx);
        } catch (UnsupportedCommOperationException e) {
            return;
        }

       
        try {
            os = sPort.getOutputStream();
            is = sPort.getInputStream();
        } catch (IOException e) {
            sPort.close();
            try {
                throw new SerialConnectionException("Error opening i/o streams");
            } catch (SerialConnectionException e1) {
                return;
            }
        }
        this.timeoutRx = timeoutRx;
        open = true;
    }

    protected final void setConnectionParameters(int bitRate, int dataBits,
            int stopBits, int hanshake) throws SerialConnectionException {

        try {
            sPort.setSerialPortParams(bitRate, dataBits, stopBits,
                    SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) {
            throw new SerialConnectionException("Unsupported parameter");
        }

        try {
            int tmp = sPort.getFlowControlMode();
            if (hanshake != tmp)
                sPort.setFlowControlMode(hanshake);
        } catch (Exception e) {
            throw new SerialConnectionException("Unsupported flow control");
        }
    }

    /**
     * Ferme le port et libere les elements associé
     */
    protected final boolean close() {

        //si open = false c'est que le port et deja fermé
        if (!open) return true;

        // Le port est bien ouvert?
        if (sPort != null) {
            try {
                // fermeture des i/o stream
                os.close();
                is.close();
                // farmeture du port
                portId = null;
                sPort.close();
                sPort.removeEventListener();
                sPort = null;
                open = false;
                return true;
            } catch (IOException e) {
                return false;
            }
        } else {
            return true;
        }
    }

    /**
     * Recuperation de la liste des ports dispo
     */
    protected final Vector<String> getPortList() {
        Enumeration portList = CommPortIdentifier.getPortIdentifiers();
        Vector<String> list = new Vector<String>();
        while (portList.hasMoreElements()) {
            CommPortIdentifier cpi = ((CommPortIdentifier) portList.nextElement());
            if (cpi.getPortType() == CommPortIdentifier.PORT_SERIAL)
                list.add(cpi.getName());
        }
        return list;
    }

    /**
     * Envoi une seconde de pause.
     */
    protected final void sendBreak() {
        sPort.sendBreak(1000);
    }

    /**
     * Lit ce qu'il y a dans le socket (c'est une lecture de chaine donc a adapter )
     */
    protected final String read() {
        if (is == null)
            return null;
        String nl = System.getProperty("line.separator");
        try {
            Thread.sleep(100);
            Scanner sc = new Scanner(is);
            String str = "";
            while(sc.hasNext()) str += sc.nextLine() + nl;
            sc.close();
            return str;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Ecrit des data dans le socket
     */
    protected final boolean write(String data) {
        if (os == null)
            return false;
        String tmpData = data + '\r';
        byte[] tmp = tmpData.getBytes();
        try {
            os.write(tmp, 0, tmp.length);
        } catch (IOException e) {
            return false;
        }
        return true;
    }

    /**
     * Pour savoir si le socket est ouvert ou non
     */
    protected final boolean isClosed() {
        return open;
    }
}

dsl pour le manque de commentaire mais j'ai du faire le menage dans le code donc supprimer des commentaire (la fleme de les remettre sinon tu as la java doc pour savoir qui fait quoi

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

WORA

Merci Twinuts 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 121 internautes ce mois-ci

Commenter la réponse de Twinuts
Meilleure réponse
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 22 août 2006 à 12:31
3
Merci
Salut,

oki je veux bien mais les paramètres sont spécifique au device que tu mets au bout de ton câble donc faudra surement que tu adapte :

String deviceName = "/dev/ttyS0"; // pour linux (ttyS0, ttyS1, ttyS2, etc...)
String deviceName = "COM0"; //pour Windows (COM0, COM1, COM2, etc...)

RS232 rs232 = new RS232(deviceName, 9600, javax.comm.SerialPort.DATABITS_8,
                    javax.comm.SerialPort.STOPBITS_1, javax.comm.SerialPort.FLOWCONTROL_NONE, 1000, 1000);

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

WORA

Merci Twinuts 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 121 internautes ce mois-ci

Commenter la réponse de Twinuts
Meilleure réponse
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 22 août 2006 à 13:01
3
Merci
Salut,

Ce sont des choses que tu te dois de connaitre avant d'utiliser le port série !

9600= pour la vitesse de transmission de donnees (9600 bauds)
javax.comm.SerialPort.DATABITS_8 = Bit de donnees (8 bit)
javax.comm.SerialPort.STOPBITS_1 =  Bit d'arret (1 bit)
javax.comm.SerialPort.FLOWCONTROL_NONE =  Controle de flux Aucun (a quoi casert ?)
1000 = c'est le timeout d'emission et reception

dans le code plus haut sort la parity pour pouvoir la changer dynamiquement

try {
            sPort.setSerialPortParams(bitRate, dataBits, stopBits,
                    SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) {
            throw new SerialConnectionException("Unsupported parameter");
        }

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

WORA

Merci Twinuts 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 121 internautes ce mois-ci

Commenter la réponse de Twinuts
Meilleure réponse
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 22 août 2006 à 13:47
3
Merci
salut,


bah ou tu veux exemple :


protected RS232(String deviceName, int bitRate, int dataBits,

            int stopBits, int hanshake, int parity, int timeoutRx, int timeoutTx) {

        if (open) return;

        try {

            portId = CommPortIdentifier.getPortIdentifier(deviceName);

        } catch (NoSuchPortException e) {

            try {

           
    throw new SerialConnectionException(e.getMessage());

            } catch (SerialConnectionException e1) {

                return;

            }

        }


        try {

            sPort = (SerialPort) portId.open("MonRS232", timeoutTx);

        } catch (Exception e) {

            try {

           
    throw new SerialConnectionException(e.getMessage());

            } catch (SerialConnectionException e1) {

                return;

            }

        }


        try {

            setConnectionParameters(bitRate, dataBits, stopBits, hanshake, parity);

        } catch (SerialConnectionException e) {

            sPort.close();

            return;

        }


        sPort.notifyOnFramingError(false);

        sPort.notifyOnOverrunError(false);

        sPort.notifyOnParityError(false);

        sPort.notifyOnDataAvailable(true);

        sPort.notifyOnOutputEmpty(true);

        sPort.notifyOnBreakInterrupt(true);


        try {

            sPort.enableReceiveTimeout(timeoutRx);

        } catch (UnsupportedCommOperationException e) {

            return;

        }


       

        try {

            os = sPort.getOutputStream();

            is = sPort.getInputStream();

        } catch (IOException e) {

            sPort.close();

            try {

           
    throw new SerialConnectionException("Error opening
i/o streams");

            } catch (SerialConnectionException e1) {

                return;

            }

        }

        this.timeoutRx = timeoutRx;

        open = true;

    }


    protected final void setConnectionParameters(int bitRate, int dataBits,

            int stopBits, int hanshake, int parity) throws SerialConnectionException {


        try {

            sPort.setSerialPortParams(bitRate, dataBits, stopBits, parity);

        } catch (UnsupportedCommOperationException e) {

            throw new SerialConnectionException("Unsupported parameter");

        }


        try {

            int tmp = sPort.getFlowControlMode();

            if (hanshake != tmp)

                sPort.setFlowControlMode(hanshake);

        } catch (Exception e) {

            throw new SerialConnectionException("Unsupported flow control");

        }

    }

.....


et a l'utilisation :


String deviceName = "/dev/ttyS0"; // pour linux (ttyS0, ttyS1, ttyS2, etc...)

String deviceName = "COM0"; //pour Windows (COM0, COM1, COM2, etc...)


RS232 rs232 = new RS232(deviceName, 9600, javax.comm.SerialPort.DATABITS_8,

           
        javax.comm.SerialPort.STOPBITS_1,
javax.comm.SerialPort.FLOWCONTROL_NONE, SerialPort.PARITY_NONE, 1000, 1000);


Bref un minimum de reflexion stp :D

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

WORA

Merci Twinuts 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 121 internautes ce mois-ci

Commenter la réponse de Twinuts
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 14 août 2006 à 11:48
0
Merci
je ne comprend pas "tu utilise quelle techno pour faire ta comme RS232?" tu veux dire quelle technologie electronique ou informatique?

j'ai pas tous compris dans le code mais dans quelle(s) variable(s) sont stocker les donnees recus?

merci ++
Commenter la réponse de didoux95
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 14 août 2006 à 12:14
0
Merci
Salut,

Quand je te parle de techno je parle d'api :
    tu utilise l'api de sun ou une api proprio?

la classe si dessus permet de lire et d'ecrire des data dans un socket rs232 donc ce n'est stoqué null par c'est a toi de la stoquer

exemple d'utilisation
RS232 rs232 = new RS232(..........);
rs232.write("toto");
System.out.println(rs232.read());
rs232.close();

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

WORA
Commenter la réponse de Twinuts
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 21 août 2006 à 21:52
0
Merci
et si non y a un truc que je ne comprend pas bien c'est quest ce que tu met entre tes parentheses ("RS232 rs232 = new RS232(..........);")

merci
Commenter la réponse de didoux95
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 21 août 2006 à 22:59
0
Merci
Salut,

les parametres que tu dois rensigner pour l'utiliser soit la config RS232 qui est dans le constructeur de la classe RS232 bref que des choses que tu te doit de savoir avant de faire une comm. RS232

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

WORA
Commenter la réponse de Twinuts
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 22 août 2006 à 11:57
0
Merci
ok, mais je comprend mieux par l'exemple donc pourrai tu me donnés un exemple ( juste 1 ligne )
RS232 rs232 = new RS232(un exemple de chaques parametres popssible);
c'est pour, egalement, savoir comment je dois les declarer, mais aussi savoir quelles sont ces parametre
STP
je te remerci.
Commenter la réponse de didoux95
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 22 août 2006 à 12:52
0
Merci
merci donc cela donne "RS232 rs232 = new RS232(deviceName, 9600, javax.comm.SerialPort.DATABITS_8,
                    javax.comm.SerialPort.STOPBITS_1, javax.comm.SerialPort.FLOWCONTROL_NONE, 1000, 1000);"
avec

9600= pour la vitesse de transmission de donnees (9600 bauds)
javax.comm.SerialPort.DATABITS_8 = Bit de donnees (8 bit)
javax.comm.SerialPort.STOPBITS_1 =  Bit d'arret (1 bit)
javax.comm.SerialPort.FLOWCONTROL_NONE =  Controle de flux Aucun (a quoi casert ?)
1000 = ???
Y a t il la gestion des bite de parite (generalement null)

je te remerci de bien vouloire verifier cette liste et de la completter .
merci.
Commenter la réponse de didoux95
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 22 août 2006 à 13:20
0
Merci
et j'oubliais quelque soit l'ordre dans le quelle on met tous ca ca march quand meme?
merci.
Commenter la réponse de didoux95
Twinuts 5266 Messages postés dimanche 4 mai 2003Date d'inscription 19 juin 2018 Dernière intervention - 22 août 2006 à 13:27
0
Merci
Salut,


ba nan tu dois respecter la signature du constructeur sinon tu vas modifier les valeur exemple si tu fais


String deviceName = "/dev/ttyS0"; // pour linux (ttyS0, ttyS1, ttyS2, etc...)

String deviceName = "COM0"; //pour Windows (COM0, COM1, COM2, etc...)


RS232 rs232 = new RS232(deviceName, 9600, javax.comm.SerialPort.DATABITS_8,

           
        javax.comm.SerialPort.STOPBITS_1,
javax.comm.SerialPort.FLOWCONTROL_NONE, 1000, 1000);


la tu met tous dans le bon ordre mais si tu fais


String deviceName = "/dev/ttyS0"; // pour linux (ttyS0, ttyS1, ttyS2, etc...)

String deviceName = "COM0"; //pour Windows (COM0, COM1, COM2, etc...)


RS232 rs232 = new RS232(deviceName, javax.comm.SerialPort.DATABITS_8, 9600,

           
        javax.comm.SerialPort.STOPBITS_1,
javax.comm.SerialPort.FLOWCONTROL_NONE, 1000, 1000);


la tu auras un bite de donnée de 9600 et un baud de 8 ce qui risque de ne jamais fonctionner

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

WORA
Commenter la réponse de Twinuts
didoux95 845 Messages postés mardi 25 avril 2006Date d'inscription 1 août 2017 Dernière intervention - 22 août 2006 à 13:35
0
Merci
mais alors le bit de parité je le met où ???


 
Commenter la réponse de didoux95

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.