IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

RS232 via UartBridge CP2101: vitesse maximale Java en ecriture


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut RS232 via UartBridge CP2101: vitesse maximale Java en ecriture
    bonjour,

    Je dois réaliser un projet pour terminer mes etudes et je bloque sur un probleme de vitesse d'ecriture et de lecture des buffers:

    Je developpe en JAVA sous Eclipse (j'ai débuté il y a 2-3 mois) et je communique avec une carte sur laquelle est implanté un Spartan III de Xilinx et un composant permettant de transformer une liaison serie en liaison USB le CP2101. Mon FPGA envoie en permanence les octets : 0,1,2,3,...,13, 0,1,.....(ce qui me permet de tester ma communication)
    Le système fonctionne tres bien a la base: j'envoie et je recois mes données a la vitesse de 921600 bauds pour une frequence de 82 304 Hz environ (je pense avoir atteint la limite max du débit). Donc au final, la comm s'effectue via USB mais je ne vois que de la liaison serie.

    Ce qui ne fonctionne pas: je ne stocke pas toutes les valeurs sur mon fichier texte. Il y a des paquet de 512 valeurs (ou un multiple de 256 valeurs) qui partent a la poubelle !!!
    Alors sur une reception de 10sec je recois environ 788 000 valeurs (au lieu de 823 040) donc on peut penser que ce n'est rien mais je ne peux pas me permettre d'en perdre...
    De plus je dois gerer une interface graphique qui, si elle est lancée, me pourri ma communication ce qui a pour consequence de perdre la moitiée des valeurs !!!!


    j'ai donc plusieurs questions aux plus professionnels que moi

    * quelle est la vitesse max d'ecriture sur un fichier texte d'un programme JAVA?
    *Quel serait le flux le plus efficace pour le stockage? (ce sont des octets uniquement et attention pas des caracteres )?
    (J'utilise
    private BufferedInputStream buffer_read;
    buffer_read = new BufferedInputStream(sPort.getInputStream(),4096) )
    en faisant varier la taille j'obtiens des resultats tres diff:
    buffer de 100 => stockage de 177 501 valeurs
    buffer de 512 => stockage de 698 369 valeurs
    buffer de 1024 => stockage de 616 449 valeurs
    buffer de 1 000 000 => stockage de 786 289 valeurs
    je lit a partir d'un thred et RS232 n'en n'est pas un mais possede une methode que j'appelle :
    mesure = rs232.read_int();
    tampon.write(mesure+" ");

    *comment allouer plus de ressources a la tache qui sauvegarde les donnees et comment faire pour eviter q'une tache type affichage graphique (j'utilise JfreeChart) ne perturbe pas cette premiere?

    *J'ai fais des tests global de mon projet meme avec pertes de donnees et j'ai l'impression qu'il a du mal a suivre... il rame tout simplement... comment faire pour que ce ne soit plus le cas? y a t-il des methodes (la majorité de mes .java sont des thread) spécifiques pour gagner en puissance?

    Merci bcp a ceux qui prendront le temps de lire et repondre a mes questions !

    PS: je ne peux joindre le fichier fait car le serveur le bloque et comme il est gros je peux pas le mettre tel quel (sauf si vous avez une sol ^^)!

  2. #2
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Bonjour, je ne crois pas qu'il y ait de vitesse maximale d'écriture limitée par java, ce serait plutôt limité par le processeur, le disque dur et l'algorithme utilisé.

    Par contre, voici 2 petites idées :

    étant donné que tu as des threads, tu as sûrement mis des méthodes synchronized, sache que ce n'est pas très bon pour les performances, il ne faut en mettre que sur les méthodes qui ont vraiment besoin d'être synchronisées.

    je ne sais pas ce que tu as fait au niveau conception, je vois ça comme ça :
    • un thread qui lit les données sur le port et qui les place dans 2 files synchronisées (une pour l'ihm, une pour la suite du traitement)
    • un thread qui lit la file destinée à l'ihm, met à jour l'ihm et supprime les données de la file au fur et à mesure.
    • un thread qui lit l'autre file et les écrits dans le fichier.

    (c'est uniquement d'après ce que j'ai compris, désolé si ça ne tient pas la route ce que je dis )
    Je n'ai jamais fait de traitement aussi rapide, mon expérience porte sur une liaison port COM recevant des trames d'un GPS à 9600 bauds.

  3. #3
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut
    Citation Envoyé par morph41 Voir le message
    Bonjour, je ne crois pas qu'il y ait de vitesse maximale d'écriture limitée par java, ce serait plutôt limité par le processeur, le disque dur et l'algorithme utilisé.

    Par contre, voici 2 petites idées :

    étant donné que tu as des threads, tu as sûrement mis des méthodes synchronized, sache que ce n'est pas très bon pour les performances, il ne faut en mettre que sur les méthodes qui ont vraiment besoin d'être synchronisées.

    je ne sais pas ce que tu as fait au niveau conception, je vois ça comme ça :
    • un thread qui lit les données sur le port et qui les place dans 2 files synchronisées (une pour l'ihm, une pour la suite du traitement)
    • un thread qui lit la file destinée à l'ihm, met à jour l'ihm et supprime les données de la file au fur et à mesure.
    • un thread qui lit l'autre file et les écrits dans le fichier.

    (c'est uniquement d'après ce que j'ai compris, désolé si ça ne tient pas la route ce que je dis )
    Je n'ai jamais fait de traitement aussi rapide, mon expérience porte sur une liaison port COM recevant des trames d'un GPS à 9600 bauds.
    humhum !
    méthodes synchronized ... c la ou on voit que je suis encore un débutant puisque j'en utilise aucune ne connaissant pas ce truc ^^ mais en fait je me suis débrouillé dans la conception de l'architecture pour justement eviter des ecritures simultanées ou problemes du genre...
    Sinon pour la conception, dans le cas de la lecture je n'ai pas fait ce que tu decris:
    j'ai une classe RS232 non thread qui possede une methode read_int() qui est appelée par la classe principale qui elle est un thread. faut peut etre ameliorer ca mais en quoi mettre un thread supplementaire va t-il améliorer les choses ?
    Est-ce que l'appel de read_int peut prendre trop de ressources ?
    j'ai parcouru internet et ait trouvé une histoire avec des tubes entre thread. Serait-il interessant de l'utiliser ?

    En fait je me demandais ce qui serait le plus efficace en terme de réception de données et de stockage: le tube ou un buffer ?

  4. #4
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Tout d'abord, tu auras quelques explications sur les threads dans ce tutoriel.
    On parle des tubes également dans ce tutoriel, ça m'a l'air pas mal, mais je ne connaissais pas.

    Citation Envoyé par suppilou69 Voir le message
    méthodes synchronized ... c la ou on voit que je suis encore un débutant puisque j'en utilise aucune ne connaissant pas ce truc ^^ mais en fait je me suis débrouillé dans la conception de l'architecture pour justement eviter des ecritures simultanées ou problemes du genre...
    en évitant de faire appel à des boucles, Thread.wait() ou Thread.notify() ?

    Citation Envoyé par suppilou69 Voir le message
    Sinon pour la conception, dans le cas de la lecture je n'ai pas fait ce que tu decris:
    j'ai une classe RS232 non thread qui possede une methode read_int() qui est appelée par la classe principale qui elle est un thread. faut peut etre ameliorer ca mais en quoi mettre un thread supplementaire va t-il améliorer les choses ?
    c'est surtout pour séparer la lecture du port COM de tout autre traitement métier ou de la mise à jour de l'IHM qui pourrait prendre du temps.

    Citation Envoyé par suppilou69 Voir le message
    Est-ce que l'appel de read_int peut prendre trop de ressources ?
    j'ai parcouru internet et ait trouvé une histoire avec des tubes entre thread. Serait-il interessant de l'utiliser ?

    En fait je me demandais ce qui serait le plus efficace en terme de réception de données et de stockage: le tube ou un buffer ?
    Là honnêtement je ne sais pas...

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Le problème de perte de données viendrait peut-être d'un remplissage du buffer du port RS232. As-tu un moyen de lire un tableau de byte via le port au lieu d'un seul int à la fois ? Ca sera déjà plus rapide pour le dépilage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre averti
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Par défaut
    hum je ne pense pas que ce soit possible de lire des ByteArray... en tout cas je n'ai pas trouvé.
    Y-a t-il un moyen de savoir si le buffer du port serie a debordé ? comment peut-on faire?

    tient ! je viens de voir qqch d'interessant : http://www.developpez.net/forums/sho...d.php?t=245213
    sur le post n°13 edam parle de la valeur 8192 or avec mon programme je detecte si je perds des donnees et qques soit la taille du buffer situé juste apres le rs232, j'ai tjs une erreur au moment du stockage 8192... y'aurait donc bien un debordement? ... hum ce qui voudrait dire que l'ecriture est trop lente...

    PS; pour mon info perso, certaines personnes arrivent a mettre du code dans des petites fenetres dans le forum.. comment faire ?

Discussions similaires

  1. liaison rs232 via excel
    Par ezbessem dans le forum Excel
    Réponses: 1
    Dernier message: 18/04/2010, 09h16
  2. accès internet via un proxy dans application java
    Par Tiéry dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 23/07/2009, 13h36
  3. Acquisition de données RS232 via USB
    Par woimanu dans le forum LabVIEW
    Réponses: 0
    Dernier message: 11/06/2009, 11h25
  4. [Java] Lecture/Ecriture PDF
    Par steeves5 dans le forum Général Java
    Réponses: 2
    Dernier message: 06/05/2009, 19h59
  5. java card ecriture/lecture de fichier
    Par rojina29 dans le forum Développement Mobile en Java
    Réponses: 0
    Dernier message: 14/11/2008, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo