Forum Programmation.c Liaison série gestion de lecture des signaux de contrôles DSR / CTS avec termios

Posté par (page perso) .
Tags :
1
18
août
2011

Bonjour à tous,

Je sèche un peux sur l'algo de programmation d'une liaison série de type RS232 en utilisant termios pour lire le changement d'état des signaux DSR /CTS.

Dans le cas d'un PC standard linux sur x86 je souhaiterai lire l'état des signaux de contrôles par interruption et non en scrutant toutes les 3ms. Je souhaiterai que ma fonction getDSR soit bloquante et réveillé seulement sur changement d'état. Mais je ne vois pas comment faire ça.
Donc je viens vers vous pour savoir si il est possible que ma fonction DSR soit bloquante ou si je dois me contenter de ma tempo?
Ci-dessous le code simpliste qui illustre mon problème.

int getDSR()
{
    int val = 0;
    if(ioctl(fd, TIOCMGET, &val) < 0 )
    {
        printf("ioctl TIOCMGET  errno=%d\n", errno);
        exit(EXIT_FAILURE);
    }

    if( val & TIOCM_DSR)
    {
	return 1;
    }
    else
    {
	return 0;
    }
}

int main( int argc, char** argv )
{
    ...
    int last_state, new_state;
    last_state = 0;
    while(1)
    {
        if ((new_state = getDSR()) != last_state)
        {
            printf("get DSR=%d", new_state);
            last_state = new_state;
        }
        usleep(3000); // 3ms
    }
    ...
}

Merci d'avance pour vos réponses,
Nicofonk

  • # TIOCMIWAIT

    Posté par (page perso) . Évalué à 2.

    un exemple en python, mais celà doit être traduisible en C

    from serial import Serial
    from fcntl import  ioctl
    from termios import (
        TIOCMIWAIT,
        TIOCM_RNG,
        TIOCM_DSR,
        TIOCM_CD,
        TIOCM_CTS
    )
    
    ser = Serial('/dev/ttyUSB0')
    
    wait_signals = (TIOCM_RNG |
                    TIOCM_DSR |
                    TIOCM_CD  |
                    TIOCM_CTS)
    
    if __name__ == '__main__':
        while True:
            ioctl(ser.fd, TIOCMIWAIT, wait_signals)
            print 'RI=%-5s - DSR=%-5s - CD=%-5s - CTS=%-5s' % (
                ser.getRI(),
                ser.getDSR(),
                ser.getCD(),
                ser.getCTS(),
            )
    
    

    http://stackoverflow.com/questions/5904895/python-monitor-serial-port-rs-232-handshake-signals

    • [^] # Re: TIOCMIWAIT

      Posté par (page perso) . Évalué à 4.

      • [^] # Re: TIOCMIWAIT

        Posté par (page perso) . Évalué à 2.

        J'avais épluché l'header termios.h mais j'ai pas pensé à aller voir le ioctls.h. Je me doutais bien qu'il y avait une astuce mais j'arrivais pas à la trouver.

        Par contre la requête TIOCMIWAIT est compatible uniquement sur des système à base de Linux avec un appel ioctl j'ai l'impression. Et n'est pas POSIX à priori. Du moins je ne retrouve pas la requête TIOCMIWAIT sur le système embarqué propriétaire sur lequel je bosse qui est "POSIX.1 Standard". Aucune primitive POSIX correpond à un appel bloquant pourrait faire l'affaire. Un tcgetattr à la limite mais le man ne référence pas TIOCMIWAIT.

        Du coup je suis obligé d'adapter mon code suivant la plateforme(OS Linux, OS Posix) ou de faire du pooling dans tous les cas :/

        Je m'y perds un peut un peu avec tout ce qui est POSIX je vais creuser un peu cette norme/certification...

        En tout cas, merci pour la réactivité,

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.