Flux rss
Rechercher : dans
Par : Mots clés Nom d'utilisateur
Messages sans réponse

[Linux - prog en C] Lécture liaison série

Grmi91, le lundi 5 février 2007 à 17:30:43 
 Signaler ce message aux modérateurs

Bonjour, voilà je souhaiterais lire des données que me renvoies mon robot par l'intermediaire d'un programme en C. J'arrive à écrire des trames et les envoyées sur la liaison série (le robot fait les mouvements que je lui demande). En revanche je n'arrive pas à lire ce qu'il me renvoie (si je tape le caractere '$', le robot devrait me renvoyer ses positions). Sous windows avec procomm j'y arrive, ce qui n'est pas le cas sous linux !!!

Donc voilà un morceau du programme:

/* Déclarations des variables*/
char trame[50];
char *trameRecue;
int fichier;

/*Ouverture du fichier (port COM1) en lecture/ecriture*/
if ((fichier=open("/dev/ttyS1",O_RDWR)) == -1 ) 
	{perror("open");exit(-1);}

(...)

/* Ecriture dans fichier (envoie sur liaison serie (port COM1)) */
if ((write(fichier, &trame, strlen(trame))) == -1 ) 
       {perror("write"); close (fichier); exit(-1);} 

/* Lecture dans fichier (reception sur liaison serie (port COM1)) */
if ((read (fichier, &trameRecue, 1)) == -1)
		{perror("open"); close (fichier); exit(-1);}

=>Au moment de la lecture, le programme attend un caractère, mais le problème c'est qu'apparement il reçoit rien !?

Si quelqu'un pouvais m'aider ça serais sympa. Merci
Configuration: Linux Fedora Core 3

1

dubcek, le mardi 6 février 2007 à 14:58:40

Si mes souvenirs sont bons, la ligne doit être ouverte en mode RAW pour lire un charactère, sinon le read attend un NL (NewLine ou return ou Enter)

A+

Répondre à dubcek

2

dubcek, le mardi 6 février 2007 à 16:03:20

Le programme sur ce site fait cela, lire un seul caractère: http://boudicca.tux.org/mhonarc/ma-linux/2001-Feb/msg00130.h­tml

Répondre à dubcek

3

Grmi'91, le mercredi 7 février 2007 à 15:32:47

OK. Déjà merci pour la réponse.
Mais pour le programme déjà écrit, je le trouve pas très compréhensible !!!
Sinon comment on fait pour mettre le port en mode RAW?

Répondre à Grmi'91

4

dubcek, le mercredi 7 février 2007 à 16:32:35
  • +3

Cette ligne enlève le mode ICANON, c-a-d traite chaque caractere sans attendre le NL, ce que j'appelle le mode raw:

tdata.c_lflag &= ~ICANON;

ce petit programme lit un caractere à la fois jusqu'à un x.
essayez le pour comprendre.

ioctl modifie les parametres de la ligne série, comme stty au niveau du shell

Répondre à dubcek

5

Grmi'91, le mercredi 7 février 2007 à 17:33:36

Ah ok merci
Donc me suis "inspiré" de ta ligne et je reçois maintenant quelque chose !!!!
C'est pas vraiment c'que j'attenfais mais c'est toujours ça.
Voila mon programme en integrale si tu veux y comprendre un peu mieux :

fichier robot.h

using namespace std;

class robot
{
	public:	
		void InitialisationLiaisonSerie ();
		void EnvoieTrame ();
		void ReceptionTrame ();
};


fichier main.cpp
#include <stdio.h>
#include "robot.h"

using namespace std;

/************* Méthode principale *************/
int main()
{
	/*definition de l'instanciation*/
	robot monRobot;
	
	/*Appel des methodes*/	
	monRobot.InitialisationLiaisonSerie();
	monRobot.EnvoieTrame();
}


fichier robot.cpp
/************************************************************************
* compilation : g++ -o robot robot.cpp main.cpp            		*
************************************************************************/

#include <stdio.h>
#include <termios.h>
#include <sys/fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#include "robot.h"

using namespace std;

/************* Methode InitialisationLiaisonSerie *************/
void robot::InitialisationLiaisonSerie()
{
	int fichier;
	struct termios termios_p;
	char modeLie[5]="L \n";

	/* Ouverture de la liaison serie */
	if ((fichier=open("/dev/ttyS1",O_RDWR)) == -1 ) 
	     {perror("open");exit(-1);}

	/* Lecture des parametres courants */
	tcgetattr(fichier,&termios_p);
		
	/* On ignore les BREAK et les caracteres avec erreurs de parite */
	termios_p.c_iflag = IGNBRK | IGNPAR;	
	
	/* Pas de mode de sortie particulier */
	termios_p.c_oflag = 0;	
	
	/* Liaison de 9600 bps, 8 bits de donnees, pas de parité (1 bit de stop par defaut) */
	termios_p.c_cflag = B9600 | CS8;
	termios_p.c_cflag &= ~PARENB;
	
	/* Mode RAW */
	termios_p.c_lflag = ~ICANON;
	
	/* 1 caractere suffit et données immediatement disponibles */
	termios_p.c_cc[VMIN] = 0;
	termios_p.c_cc[VTIME] = 1;
	
	/* Sauvegarde des nouveaux parametres */
	tcsetattr(fichier,TCSANOW,&termios_p);	
		
	/* Envoie du mode lié pour une utilisation manuel*/
	if ((write(fichier, &modeLie, strlen(modeLie))) == -1 ) 
	     {perror("envoie trame");close (fichier); exit(-1);}
	
	/* Fermeture */
	close(fichier);
}

/************* Methode EnvoieTrame *************/
void robot::EnvoieTrame()
{
	/* Declaration des variables*/
	char trame[50];
	char trameRecue[10];
   	int longueurTrame, fichier;

	/*Ouverture du fichier (port COM1) en lecture/ecriture*/
	if ((fichier=open("/dev/ttyS1",O_RDWR)) == -1 ) 
		{perror("open");exit(-1);}
	while(1)
        {
	        /* Saisie trame */
	        printf("Entrez une trame : ");
                scanf ("%s", &trame);
   	
                longueurTrame = strlen(trame);   	
 
                /* Ajout de caracteres de fin de trame*/
   		trame[longueurTrame] = ' ';
   		trame[longueurTrame+1] = '\n';
   		trame[longueurTrame+2] = '\0';
   						
		/* Ecriture dans fichier (envoie sur liaison serie (port COM1)) */
   		if ((write(fichier, &trame, strlen(trame))) == -1 ) 
		     {perror("write"); close (fichier); exit(-1);} 
		
		/* Lecture dans fichier (reception sur liaison serie (port COM1)) */
		if ((read (fichier, &trameRecue, 1)) == -1)
		     {perror("open"); close (fichier); exit(-1);}
	
		printf ("trame recue: %02x %c \n\n", trameRecue, trameRecue);
	}
	close (fichier);
}


voila. Et donc le problème c'est que déjà à l'execution, quelque soit ce que je tape ça me renvoie toujours la même valeurs:
 ./robot
Entrez une trame : $
trame recue: fef317f0 ð

Entrez une trame : B+100:30
trame recue: fef317f0 ð

et si je relance l'execution ba ça m'affiche d'autre caractere:
./robot
Entrez une trame : B+100:30
trame recue: fef6a970 p

Entrez une trame : $
trame recue: fef6a970 p


Donc voilà quoi...

Répondre à Grmi'91

6

 Grmi'91, le mercredi 7 février 2007 à 17:56:24

En fait je viens de remarquer que je ne fais que lire l'adresse de trameRecue.
En l'initialisant et modifiant la fin du code par

        /* Declaration des variables*/
	char trame[50];
	char trameRecue[10];
	int nbOctetLu, i=0;

   	int longueurTrame, fichier;

        /* Initialisation des trames */ 
	memset(trame, 0x00, 50);
	memset(trameRecue, 0x00, 10);
        (...)
        else
   		{
   			trame[longueurTrame] = ' ';
   			trame[longueurTrame+1] = '\n';
   			trame[longueurTrame+2] = '\0';
   						
			/* Ecriture dans fichier (envoie sur liaison serie (port COM1)) */
   			if ((write(fichier, &trame, strlen(trame))) == -1 ) 
				{perror("write"); close (fichier); exit(-1);} 
			sleep(2);
			/* Lecture dans fichier (reception sur liaison serie (port COM1)) */
			if ((read (fichier, trameRecue, 10)) == -1)
				{perror("open"); close (fichier); exit(-1);}
			printf ("trame recue : ");
			
			for (i=0; i<10; i++)
				printf (" %02x %c - ", trameRecue[i], trameRecue[i]);
		}

je constate que je lis rien du tout sur le port !!!!!

Répondre à Grmi'91
Programmation d'une liaison serie Bonjour, je veux un programme en delphi pouvant m'aider à programmer une liaison serie du port USB.s'il vous plait aider moi si vous pouvez. www.commentcamarche.net/forum/affich-12796132-programmation-d-une-liaison-serie
Programme liaison serie en C Je suis en BTS II et je cherche à faire un programme me permmettant de récupérer des chaînes de caractères sur la liaison série RS232 et de copier celles çi dans un fichier texte... Ce programme doit fonctionner dans les deux sens. Si quelqu'un... www.commentcamarche.net/forum/affich-72029-programme-liaison-serie-en-c
Liaison série linux Etant étudiant en 2ème année de bts informatique industrielle, je prépare actuellement mon projet de fin d'année.Ce dernier consiste à récupérer des données d'un télémètre laser à l'aide d'une liaison série RS232 sous un poste sous linux. Ces données... www.commentcamarche.net/forum/affich-67941-liaison-serie-linux
[Langage C] C/C++ Erreur de segmentationQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux... www.commentcamarche.net/faq/sujet-4791-langage-c-c-c-erreur-de-segmentation
Compiler du C sous Linux/UNIXSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir... www.commentcamarche.net/faq/sujet-203-compiler-du-c-sous-linux-unix
Ressources programmation système LinuxVoici quelques liens qui vous permettront de vous aider à vous débrouiller avec la programmation système sous Linux. Tutoriels Page de M. Billaud (fr) Un cours/tutoriel sur la programmation système et réseau sous Unix. Très complet. Cours de... www.commentcamarche.net/faq/sujet-10657-ressources-programmation-systeme-linux
[programme c] comment exécuter un programme cbonjour je suis un débutant sur linux et j aimerais savoir comment on peut exécuter un programme c après l avoir taper et compiler? Merci d avance à tous ceux ki m aideront dans mon apprentissage www.commentcamarche.net/forum/affich-2091609-programme-c-comment-executer-un-programme-c
Prog c++ sous linux et windowssalut a tous voila j'aimerais faire un prog c++ qui tourne sous plusiseurs plateformes... en gros linux et windaube. Ma question est : est ce possible? Je pense qu'il est possible de faire une seule source compilable sous linux et sous windows(avec... www.commentcamarche.net/forum/affich-865690-prog-c-sous-linux-et-windows
WriteFile et liaison sérieBonjour, je souhaiterai avoir un exemple de programme en C++ pour envoyer un caractère dans un premier temps, plusieurs dans un second. J'ai entendu parlé de la fonction "WriteFile" Mon but est d'envoyer via liaison série RS232 des caractères venant... www.commentcamarche.net/forum/affich-11289313-writefile-et-liaison-serie
Port série et port parallèleIntroduction aux ports d'entrée-sortie Les ports d'entrée-sortie sont des éléments matériels de l'ordinateur, permettant au système de communiquer avec des éléments extérieurs, c'est-à-dire d'échanger des données, d'où l'appellation d'interface... www.commentcamarche.net/contents/pc/serie.php3
Langage C - Les variablesLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans... www.commentcamarche.net/contents/c/cvar.php3
Programme informatiqueQu'est-ce qu'un programme informatique? Un programme informatique est une succession d'instructions exécutable par l'ordinateur. Toutefois, l'ordinateur ne sait manipuler que du binaire, c'est-à-dire une succession de 0 et de 1. Il est donc... www.commentcamarche.net/contents/langages/programme.php3