Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/03/2013, à 17:58

bird12358

Récupération de données en RS232

Bonjour,
je voudrais développer une application sous linux pour récupérer des données à partir d'un port RS232. J'ai donc trouvé un lien expliquant comment programme cette partie:
http://www.faqs.org/docs/Linux-HOWTO/Se … HOWTO.html

Voici mon programme:

#include <unistd.h>
#include <stdlib.h>
#include <strings.h>



#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>

#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyUSB0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

void signal_handler_IO (int status);   /* definition of signal handler */
int wait_flag=TRUE;                    /* TRUE while no signal received */

main()
{
    int fd,c, res;
    struct termios oldtio,newtio;
    struct sigaction saio;           /* definition of signal action */
    char buf[255];

    __sigset_t t;

    /* open the device to be non-blocking (read will return immediatly) */
    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fd <0) {perror(MODEMDEVICE); exit(-1); }

    /* install the signal handler before making the device asynchronous */
    saio.sa_handler = signal_handler_IO;
    saio.sa_mask = t;
    saio.sa_flags = 0;
    saio.sa_restorer = NULL;
    sigaction(SIGIO,&saio,NULL);

    /* allow the process to receive SIGIO */
    fcntl(fd, F_SETOWN, getpid());
    /* Make the file descriptor asynchronous (the manual page says only
           O_APPEND and O_NONBLOCK, will work with F_SETFL...) */
    fcntl(fd, F_SETFL, FASYNC);

    tcgetattr(fd,&oldtio); /* save current port settings */
    /* set new port settings for canonical input processing */
    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR | ICRNL;
    newtio.c_oflag = 0;
    newtio.c_lflag = ICANON;
    newtio.c_cc[VMIN]=1;
    newtio.c_cc[VTIME]=0;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);

    /* loop while waiting for input. normally we would do something
           useful here */
    while (STOP==FALSE) {
        printf(".\n");usleep(10);
        /* after receiving SIGIO, wait_flag = FALSE, input is available
             and can be read */
        if (wait_flag==FALSE) {
            res = read(fd,buf,1);
            buf[res]=0;
            printf("received:%s:%d\n", buf, res);
            if (res==1) STOP=TRUE; /* stop loop if only a CR was input */
            wait_flag = TRUE;      /* wait for new input */
        }
    }
    /* restore old port settings */
    tcsetattr(fd,TCSANOW,&oldtio);
}

Je récupére bien les données du RS232 mais les données ne sont pas envoyées.

Quelles erreurs j'ai faites dans mon code qui empêche l'envoie des données sur le RS232?

Si quelqu'un pouvait m'aider.
D'avance merci.

Hors ligne

#2 Le 27/03/2013, à 08:42

mrlem

Re : Récupération de données en RS232

bird12358 a écrit :

Je récupére bien les données du RS232 mais les données ne sont pas envoyées.

Quelles erreurs j'ai faites dans mon code qui empêche l'envoie des données sur le RS232?

Et bien, ton morceau de code ne couvre que la réception de données (avec l'appel "read"). Si tu veux que l'envoi de données fonctionne, il semble évident qu'il faille le coder... (indice : sans doute avec un appel "write" à un moment ou un autre...)

Juste un conseil : quand on copie du code, la première chose à faire avant de vouloir le modifier, c'est d'essayer de le comprendre...

Hors ligne