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

C# Discussion :

SerialPort : Parité différente sur le premier bit


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut SerialPort : Parité différente sur le premier bit
    Bonjour,

    Je suis entrain de codé une application qui doit communiquer avec un board par le port série. J'utilise pour cela la class SerialPort de System.IO.Ports.

    Je suis capable de communiquer mais mon problème c'est que le premier bit du message que j'envoi, doit avoir un bit de parité MARK alors que le reste du message doit avoir une parité de SPACE.

    Ce que j'ai essayé c'est de mettre la parity à MARK, d'écrire le premier bit sur le port puis de changer la parity à SPACE puis d'écrire le reste du message sur le port. La réponse du board a mon message n'a aucun sense se qui me laisse penser à un problème de parité. J'ai aussi utiliser thred.sleep(x) entre mes 2 écritures sur le port mais alors le board ne me répond même plus.

    Ça fait 2h que je fouille sur internet sans rien trouvé qui ressemble à ce dont j'ai besoin...
    Est-ce que quelqu'un peut me pointer dans la bonne direction?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 530
    Par défaut
    Utilisez un analyseur de protocole pour lire les informations envoyées sur les files du port série.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Utilisez un analyseur de protocole pour lire les informations envoyées sur les files du port série.
    C'est déjà fait. Je sais ce qu'il faut que j'envoi mais mon problème c'est que le bit de parité doit être uniquement sur le premier byte du message. Il faut donc changer la parité a SPACE pour les autres bytes.

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 565
    Par défaut
    Bonsoir, je ne connais le matériel sur quoi vous bossez, mais il ne faut pas confondre les parametres de communications qui sont propres a l'UART (c'est la puce qui permet de gérer le port série) comme la vitesse de transmission, la parité, le protocole de communication (XON/XOFF, RTS/CTS, ...), nb de bit stop, nb de bits de données, ... et le protocole de communication que votre board utilise pour dialoguer, il s'agit de trame spécifique.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut
    Citation Envoyé par ddaime Voir le message
    Bonsoir, je ne connais le matériel sur quoi vous bossez, mais il ne faut pas confondre les parametres de communications qui sont propres a l'UART (c'est la puce qui permet de gérer le port série) comme la vitesse de transmission, la parité, le protocole de communication (XON/XOFF, RTS/CTS, ...), nb de bit stop, nb de bits de données, ... et le protocole de communication que votre board utilise pour dialoguer, il s'agit de trame spécifique.
    En effet. Ce qui arrive c'est que je dois passer un message composé de plusieurs bytes hexa. Le premier byte du protocole est l'adresse de la machine. Ce byte et uniquement lui doit avoir MARK comme parité et tous les autres SPACES sinon le board avec lequel je communique ne me repond pas. Ça c'est une particularité du protocole que j'utilise. Malheureusement, je ne suis pas capable de faire ça.

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    c'est que le premier bit (ou octet ?) du message que j'envoie, doit avoir un bit de parité MARK alors que le reste du message doit avoir une parité de SPACE.
    Je ne comprends pas : MARK et SPACE indiquent si le voltage en absence d'émission est à 0 ou 12 volts. C'est juste une inversion globale des tensions et c'est indépendant de la gestion du bit de parité.
    voir : http://www.wcscnet.com/Tutorials/SerialComm/Page1.htm

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Pour clarifier

    Un bit de parité est un bit
    Il peut etre
    ON ou OFF
    True ou False
    MARK ou SPACE

    C'est la meme chose !!

    Mais bon ... sans entrer dans un debat technique hardware, Bluberiman ne nous explique pas bien si son problème est materiel ou logiciel

    Et sans un minimum de bout de code avec un peu de commentaire sur le protocole ca n'ira pas loin !

  8. #8
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    Première chose à faire, bien vérifier ton code et la configuration de tes ports.

    Ne pas oublier de fermer et réouvrir le port pour que le changement de configuration soit pris en compte.

    Deuxième chose, si tu as la possibilité de vérifier effectivement ce que tu envois (osciloscope, analyseur, ...) réellement sur le port, indépendamment de la réponse de ton appareil, vérifie que ce que tu envoie correspond exactement à ce qui dois être envoyer.

    Troisième chose, si ce que tu envoie est correct, vérifie toujours avec l'oscilo ou l'analyseur que ce que te répond l'appareil est conforme à ce qu'il devrait répondre.

    Enfin, vérifie que tu laisse ton port dans une configuration correcte pour recevoir la réponse de ton appareil. Il faut espérer qu'il répond dans la même configuration que le dernier octet que tu as envoyer. Sinon il va falloir que tu rechange la config de port entre le dernier envoi et la réception et tu as donc de forte chance de perdre toutes ou parties des données de la réponse.


    PS : Un protocole qui nécessite de changer la configuration du port en cours de transmission, c'est quand même pas banal et plutôt très dangereux niveau perte de données. Personnellement, je n'en avais jamais rencontré.

  9. #9
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Je suis capable de communiquer mais mon problème c'est que le premier bit du message que j'envoi, doit avoir un bit de parité MARK alors que le reste du message doit avoir une parité de SPACE.
    Moi je crois que apres avoir bien compris tout ce qui se cache dans cette petite phrase la solution va apparaitre

  10. #10
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut
    Désolé de ne pas être claire, je ne suis pas familité avec la communication par port série et je crois avoir pris un gros morceau pour commencer.

    Voici donc plus de détails.
    Ce que le protocole dit :
    Communication between the host and the board occurs through a serial data link operating at 19.2 kbaud in a "wakeup" mode. 11 bit data packet consists of one start bit, 8 data bits, a 9th "wakeup" bit and one stop bits.

    In wakeup mode, the host (mon programme doit simulé le host) sets the 9th bit each time it sends the first byte of a message to the board. For all additional bytes in the message, this bit is cleared.
    J'ai demandé l'aide d'un tech électronique de ma compagnie qui connait bien les ports séries et c'est lui qui m'a dit que le premier byte devait etre envoyé en MARK et le reste en SPACE. J'avoue je ne saisie pas très bien pourquoi.

    Voici en gros mon code mais il ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    byte[] temp = new byte[2];
    byte[] address= new byte[1];
    byte[] newMsg = HextoByte(msg); //Convertie la string en byte
    byte[] MessageWithCRC = new byte[MessageWithCRC.length+2];
    byte[] MessageWithoutAddress = new byte[MessageWithCRC.length-1]; //A envoyé avec le wakeup bit a 0
     
    ushort crc=crc16.CalculCRC16(newMsg); //calcul du crc
    temp = bitconverter.getbyte(crc);
    ...

    Ca continue et j'ai donc mon premier byte dans address et le reste dans MessageWithoutAddress


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Envoie du premier byte
    this.parity = "Mark";
    comPort.Write(address,0,address.length);
     
    System.Threading.Thread.Sleep[20]; //delai pour laisser windows changer la parity
     
    this.parity="Space";
    comPort.write(MessageWithoutAddress,0,MessageWithoutAddress.length);

  11. #11
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    le premier byte (du message) devait etre envoyé en MARK et le reste en SPACE.
    C'est plus clair.
    C'est bien le bit de parité qui doit être à 1 (MARK) pour le premier octet et 0 (SPACE) pour les octets suivants.
    J'avoue je ne saisie pas très bien pourquoi.
    La raison est que le destinataire peut ainsi détecter les débuts de messages pour se resynchroniser, si pour une raison ou une autre le message précédent était incomplet.

    Dans ton code, le sleep était une bonne idée, mais tu pourrais essayer de fermer le port (ouvert avec MARK) et de le rouvrir (avec SPACE) plutôt que de changer simplement la parité. Ca devrait marcher.

  12. #12
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 254
    Par défaut
    mais tu pourrais essayer de fermer le port (ouvert avec MARK) et de le rouvrir (avec SPACE) plutôt que de changer simplement la parité
    C'est même très probablement nécessaire pour que le changement soit effectivement pris en compte

Discussions similaires

  1. Sum différents sur sur une même table ...
    Par Saloucious dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2005, 15h51
  2. [Language] Aide sur mon premier programme Java?
    Par hash2zo dans le forum Langage
    Réponses: 15
    Dernier message: 27/09/2005, 19h26
  3. probleme avec les string sur ITA2 64 bits!
    Par vince3320 dans le forum SL & STL
    Réponses: 5
    Dernier message: 22/08/2005, 19h59
  4. Réponses: 2
    Dernier message: 11/01/2005, 14h10
  5. [Debutant] GROUP BY sur les premiers caracteres d'un champ
    Par seb-astien dans le forum Langage SQL
    Réponses: 8
    Dernier message: 09/11/2004, 14h53

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