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

Bibliothèques tierces Python Discussion :

un 9ème bit sur l'UART


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut un 9ème bit sur l'UART
    Hello,

    Avec le module PySerial, il est relativement facile d'envoyer des mots de 9 bits sur un port série. Il suffit d'avoir une table de parité et de configurer en Odd ou Even à la volée, comme dans le code ci dessous.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    partab=[ \
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,\
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,\
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,\
    	0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0]
     
    def putdata(data):
    	byte=data & 0xff
    	if data & 0x100:
    		bit8 = 1
    	else:
    		bit8 = 0
    	if partab[byte] ^ bit8 :
    		port.setParity('O')
    	else:
    		port.setParity('E')
    	port.write(chr(byte))
    Par contre, pour recevoir un mot de 9 bits, il faut réceptionner le mot de 8 bits envoyé (ainsi que son bit de parité inaccessible pour nous), CALCULER la parité du mot de 8 bits reçu, VOIR SI LE PC DETECTE UNE FAUTE DE PARITE ET INVERSER LE BIT SI IL Y A FAUTE. Tout mon problème est là... Sauf erreur de ma part, la parité en reception est innaccessible, il me reste un espoir dans la détection d'erreur... Au cas où Win32 le gère, est-ce implémenté dans PySerial? J'avoue que j'ai du mal avec la doc, je n'ai d'ailleurs que celle générée par Doxygene sur le module PySerial.

    N.B On peut parfaitement inverser la parité à la volée, Win32 le fait sans problème. Par contre, il lui faut 2.5msec sur mon PC et beaucoup plus pour une liaison série sur module USB...

    A+

    Pfeuh

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Hello,

    UP UP UP UP UP UP UP UP UP UP UP UP!

    Ca ne passionne personne, les vrais questions? J'aurais dû demander comment concatener 2 chaines...

    A+

    Pfeuh

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Faute de pouvoir te renseigner serieusement a propos de pySerial, je suis ton topic de pres car je suis concerne par des problematiques similaires, a ceci pres que je code mon driver UART en C.

    J'ai etudie un petit peu ce module suite a ton post. PySerial me parait etre un module python permettant simplement de piloter 'a la main' un UART et est donc limite aux in formations contenues dans ses registres.

    Par contre, je peux te confirmer que le bit de parite est inaccessible en reception. S eul le bit2 (parity error) du registre LSR (base + 5) nous fournit une information co ncernant la parite.
    Malgres tout, je serais etonne que pySerial puisse trouver une facon de nous informer sur cette parite en reception. Cela signifierait que ce module est capable de traiter les donnes recues en amont de l'UART, chose qui parait impossible. Les seules donnees entrantes sont celles contenues dans le registre RBR (base + 0) ainsi les status corr espondant.

    Pour en venir a ta question, je ne comprend pas ce qui pourrait t'inciter a envoyer un mot de 9 bits utiles (hors parite stricte et bits de start/stop).
    Pourquoi ne pas faire 2 envois de mots de 8 bits en traitant leur contenu ?

    Si ce 9eme bit represente une meta-donnee pertinente lie a l'octet qui le precede, pou rquoi ne pas grouper tes mots de 8bits par groupes de 8 mots suivits d'un mot de 8bits representant la meta-donnee des 8 mots precedant ?
    exemple:

    mot 1: [01110001] meta-donne: [0]
    mot 2: [01110110] meta-donne: [1]
    mot 3: [11000111] meta-donne: [1]
    mot 4: [10101001] meta-donne: [1]
    mot 5: [00000010] meta-donne: [0]
    mot 6: [01101010] meta-donne: [1]
    mot 7: [10011100] meta-donne: [1]
    mot 8: [01010001] meta-donne: [1]

    9eme mot regroupant les meta-donnes: [01110111]


    J'ai peut etre mal compris ta question, dans ce cas je suis desole, mais je reste vraiment tres interesse par cette discussion.

    Enjoy !

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Ca ne passionne personne, les vrais questions? J'aurais dû demander comment concatener 2 chaines...
    Ben pour ma part, je comprends même pas le titre de ta question alors... par contre je peux te dire comment concaténer une chaîne si tu veux.

    Non, je plaisante.. . Bon ok je sors...

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    C'est pas très étonnant que tu aies peu de réponse, c'est quand même un forum de programmation, pas d'électronique, peu de gens savent seulement ce qu'est un UART.


    Par contre, je ne saisis pas quel est ton problème.
    Si le registre de statut indique une erreur de parité, il faut que tu jettes la trame reçue et que tu redemandes son envoi à l'émetteur. Est-ce pour utiliser le bit de parité comme un bit de donnée comme Thornska le suppose?
    Le bit de parité est quand même utile!

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,
    Citation Envoyé par Céroce Voir le message
    C'est pas très étonnant que tu aies peu de réponse, c'est quand même un forum de programmation, pas d'électronique, peu de gens savent seulement ce qu'est un UART.


    Par contre, je ne saisis pas quel est ton problème.
    Si le registre de statut indique une erreur de parité, il faut que tu jettes la trame reçue et que tu redemandes son envoi à l'émetteur. Est-ce pour utiliser le bit de parité comme un bit de donnée comme Thornska le suppose?
    Le bit de parité est quand même utile!
    Oh, des réponses! Absolument, je comptais utiliser le bit de parité comme un bit de donnée.
    Je suis d'accord, on est sur un forum de programmation, pas d'électronique, mais bon, un peu de culture générale, ça ne fait pas de mal. Le mode 9 bits est très utilisé dans le milieu industriel, notamment sur les bus à un maitre et plusieurs esclaves. Pour la petite histoire, ce mode a été rajouté dans la plupart des coeurs des microcontrôleurs Intel et Pic suite une une grosse demande de l'industrie.

    Le maitre envoie une trame ou le premier octet a le 9ème bit à 1 (Mark). Dans les esclaves, celà déclenche une interruption et les réveille. Ils examinent tous le premier octet, qui est en fait le numéro d'esclave. Celui qui est concerné reprogramme son UART de façon à recevoir la suite de la trame, tous les autres se rendorment et ne verront même pas passer la suite de la trame. En fait, si on regarde les chose de haut (comme tout programmateur PC), ce 9ème bit sert à déclencher une interruption et n'a aucune autre utilité, dans tout les échanges de trames, il est toujours à 0... Mais c'est un standard, dans un monde où l'économie d'énergie et le non gaspillage des cycles-machines a encore un sens.

    Citation Envoyé par Thornska
    Si ce 9eme bit represente une meta-donnee pertinente lie a l'octet qui le precede, pourquoi ne pas grouper tes mots de 8bits par groupes de 8 mots suivits d'un mot de 8bits representant la meta-donnee des 8 mots precedant ?
    exemple:
    Pour des raisons pratiques, je prèfère coller au standard qui existe déjà. En fait, je m'en suis très bien sorti pour émuler un maître, puisque l'on peut en python émettre réellement 9 bits. Comme en réception on peut recevoir 9 bits aussi (dont le dernier n'est ni utilisable ni utilisé), j'ai réussi à connecter un PC directement sur le bus et émuler un maitre.

    Un esclave aussi, d'ailleurs, mais c'est beaucoup plus contraignant, puisque faute de pouvoir se réveiller sous IT, on doit recevoir toutes les trames et ne traiter que ce qui nous concerne. En clair, il faut non seulement réécrire la couche UART en C, mais aussi la couche COM, et ça, c'est pénible.

    Merci pour vos réponses, A+,

    Pfeuh

  7. #7
    Candidat au Club
    Profil pro
    Developpeur
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Vive le MDB !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/07/2006, 09h13
  2. sticky bit sur /tmp
    Par sebhm dans le forum Administration système
    Réponses: 4
    Dernier message: 01/06/2006, 16h47
  3. Operations bit à bit sur des structures
    Par DarkNagash dans le forum C
    Réponses: 4
    Dernier message: 16/03/2006, 13h59
  4. Réponses: 2
    Dernier message: 27/02/2006, 09h40
  5. Décalage de bit sur unsigned char [8]
    Par dboulange dans le forum C++
    Réponses: 14
    Dernier message: 26/07/2005, 14h10

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