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

Windows Forms Discussion :

[C# 2.0] Question sur la classe SerialPort


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par défaut [C# 2.0] Question sur la classe SerialPort
    Salut, je développe une appli qui va utiliser le protocole modbus en liaison série RS232. Ma classe de base dérive de la classe SerialPort. Cependant, il y a quelque chose que je comprends pas trop.

    Dans mon form client, je crée un port en tant qu'instance de cette classe de base (celle de ma dll qui hérite de SerialPort). Mais quand je récupère les données de l'autre côté, j'obtiens deux choses différentes.

    Si je fais ceci dans mon form client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clientModbusPort.sendData(frameToSend);
    j'appelle la fonction sendData de ma dll qui prend en paramètre un tableau de byte que j'envoie. Cette fonction pour l'instant se résume à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void sendData(byte[] bufferSend)
    {
      this.Write(bufferSend, 0, bufferSend.Length);
    }
    et je récupère du côté serveur la trame complète (qui doit contenir au total plusieurs dizaines de bytes)

    Par contre, si j'utilise la fonction write directement dans le form client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clientModbusPort.Write(frameToSend, 0, frameToSend.Length);
    J'obtiens une trame coupée par tranche de 8 bytes affichés en hexa

    Exemple1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    3A 30 31 30 33 30 30 30 30 30 30 30 30 0D 0A
    Exemple2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    3A 30 31 30 33 30 30 30
    30 30 30 30 30 0D 0A
    Pourquoi cette différence? (l'encodage utilisé est ASCII)

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut
    Salut, j'ai eu le même problème.
    Afin de contourner cette difficulté, j'ai été obligé de calculer la taille de la trame que j'attendais en réponse et de stopper la lecture uniquement lorsque j'ai reçu toute la trame.

    Sinon l'évenement Read (il me semble) se déclenche de manière un peu bizzard, dans certains cas il te prend un seul octet puis le reste de la trame, dans d'autres cas il pend toute la trame d'un coup ou bien il fait ce que tu présente plus haut.

    L'inconvénient de cette méthode est qu'il te faut gérer les trames d'exeptions ModBus qui sont de 5 Octets il me semble et donc de modifier la taille de la trame en attente.

    Selon moi cette méthode est correcte puisque Modbus est un protocol Maitre esclave "pure", aucunes infos ne remonteront toutes seules vers le maitre sans qu'il en est fait la demande. Dans tous les cas tu peux connaître la taille des trames que tu va recevoir !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par défaut
    Code Form Serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void serveurModbusPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
      //Traite les données reçues.
      byte[] serverReceiveBuffer = serveurModbusPort.receiveData();
     
      if (serverReceiveBuffer != null)
      {
        ReceiveData(serverReceiveBuffer);
      }
    }
     
    //Fonction ReceiveData(serverReceiveBuffer) sert à traiter les octets lus pour ensuite construire la trame de réponse octet par octet.
    Code dll:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public byte[] receiveData()
    {
      if (this.BytesToRead > 0)
      {
        byte[] bufferRead = new byte[this.BytesToRead];
     
        this.Read(bufferRead, 0, bufferRead.Length);
     
        return bufferRead;
      }
      else
      {
        return null;
      }
    }
    Pourtant, très souvent, ça me découpe toujours ma trame par morceau de 8 octets alors que je lui dis bien de lire la totalité du tableau de byte[] passé en paramètre. Je ne vois donc pas du tout où est ce que ça cloche (et donc comment y remédier).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par défaut
    Comment faire pour stopper la lecture uniquement lorsqu'on a reçu toute la trame?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Par défaut
    J'ai exactement le même problème que toi mais personne n'y repond :/
    Liaison RS-232

Discussions similaires

  1. question sur MFC class CAsynCSocket
    Par doommick31 dans le forum MFC
    Réponses: 2
    Dernier message: 06/05/2007, 10h51
  2. [stl] questions sur la classe string
    Par r0d dans le forum SL & STL
    Réponses: 3
    Dernier message: 23/02/2007, 00h31
  3. Question sur une classe <template>
    Par Pingva dans le forum C++
    Réponses: 1
    Dernier message: 26/01/2007, 17h16
  4. Question sur JDBC classe mysql
    Par oOoOuuhmAn dans le forum JDBC
    Réponses: 2
    Dernier message: 11/05/2006, 17h44
  5. Question sur la classe InputStream
    Par Zec Merquise dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 26/10/2005, 02h36

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