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 :

Linux : ouverture port série


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2010
    Messages : 17
    Points : 23
    Points
    23
    Par défaut Linux : ouverture port série
    Bonjour,

    Je réalise en ce moment un programme qui doit ouvrir le port série pour y envoyer des informations. En réalité, il s'agit du port /dev/ttyUSB0, puisque j'utilise un adaptateur serie->usb
    J'utilise pour cela la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open("/dev/ttyUSB0", O_RDWR|O_NOCTTY);
    La commande open(); est contenue dans l'entête : fcntl.h

    Le problème est que le programme semble se bloquer sur cette commande : aucune erreur n'est renvoyée, mais rien ne se produit.
    Qu'est-ce qui ne va pas ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 408
    Points : 23 803
    Points
    23 803
    Par défaut
    Difficile de t'en dire plus sans voir le reste de l'environnement (ton programme, l'état du système de fichier et le matériel lui-même), mais il y a fort à parier que l'ouverture du port série implique la gestion des signaux de contrôle du port série, lequel ait alors besoin d'une réponse de type CD ou CTS pour considérer l'équipement terminal comme ouvert.

    Essaie d'ouvrir ton fichier en mode non-bloquant avec O_NONBLOCK puis de modifier ce comportement soit avec des ioctl(), soit avec termios().

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    salut,
    j'ai ecrit un ptit programme au taf aujourd'hui, qui fonctionne
    je te l'ai bien expliqué au cas ou

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
     
     
     
    int main(void)
    {
     
    	int port_serie;
    	struct termios options;
    	int reception;
    	char buffer[16] = "";
    	char data[] = ":0103070D005098\r\n"; //message que tu veux envoyer
     
     
    	port_serie = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);//lecture et ecriture | pas controlling terminal | ne pas attendre DCD
     
    	//cas d'erreur d'ouverture
    	if(port_serie < 0)
    	{
    		perror("Erreur d'ouverture du port serie");
    		exit(-1);
    	}
     
    	else
    	{
    		printf("Port serie numero %d bien ouvert. \n", port_serie);
     
    		//chargement des données
    		tcgetattr(port_serie, &options);
    		//B115200 bauds
    		cfsetospeed(&options, B115200);
    		options.c_cflag |= (CLOCAL | CREAD);//programme propriétaire du port
    		//structure en 8N1 !!
    		options.c_cflag &= ~PARENB; //pas de parité
    		options.c_cflag &= ~CSTOPB; // 1 bit de stop
    		options.c_cflag &= ~CSIZE; //option a 0
    		options.c_cflag |= CS8; //8 bits
    		tcsetattr(port_serie, TCSANOW, &options); //enregistrement des valeurs de configuration
    		printf("Configuration OK strcuture en 8N1 !. \n");
     
    			// Envoie de donnees.
    			printf("Envoie des donnees en cours ... \n");
    			if (write(port_serie, data, 17) < 0){perror("ERROR\n");}
    			printf("Envoie Termine. \n");
     
     
    			//printf("Attente. \n");
    			//sleep(2);
    			//printf("Fin Attente. \n");
     
     
    			// Lecture des donnees.
    			printf("Lecture des donnees en cours ... \n");
    			fcntl(port_serie,F_SETFL,10);//mode bloquant pour la fonction read() si aucun caractere dispo, programme attend
     
    			reception=read(port_serie,buffer,16);//buffer contitendra les données, 16 est le nombre d'octets a copier dans cet espace
    			printf("message recu : %s\n",buffer);
     
     
     
     
    			if (reception == -1)
    			printf("Erreur lecture port serie\n");
     
    			printf("Reception finie.\n" );
     
    	}
     
    	close(port_serie);//fermeture du port serie
     
    return 0;
    }
    que tu utilise un adaptateur va rien changer, cela va etre totalement transparent aux "yeux" de LINUX

Discussions similaires

  1. Ouverture port série
    Par steven22 dans le forum Visual C++
    Réponses: 1
    Dernier message: 02/09/2009, 12h07
  2. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 11h43
  3. ouverture port série?!
    Par Malek_BAKLOUTI dans le forum Composants
    Réponses: 2
    Dernier message: 04/05/2006, 12h06
  4. problème ouverture de port série
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 26/04/2006, 17h42
  5. Port série sous Linux
    Par naoned dans le forum Bibliothèques tierces
    Réponses: 2
    Dernier message: 21/11/2005, 17h45

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