Swisslinux.org

− Le carrefour GNU/Linux en Suisse −

 

Langue

 

Le Forum

Vous n'êtes pas identifié.

#1 17 Feb 2005 09:56:00

PoZZyX
Affranchi(e)
 
Date d'inscription: 22 Jan 2005
Messages: 8

[RS232] Problème de connexion

Hello,

Je suis nouveau sur linux et je connais un peu la prog en C et j'ai un problème avec la communication RS232. J'utilise Mandrake linux 10.1 sur les 2 pc. Mon problème c'est que :

Le pc A demande à l'utilisateur une valeur x.
Le pc A envoie au pc B la valeur x.
Le pc B reçois la valeur x.
Le pc B demande à l'utilisateur une valeur.
**** ici commencent les problèmes ****
Le pc A qui est en attente sur un read reçoit qqchose avant que l'utilisateur B aie entré qqchose a envoyé (donc le write n'est pas encore fait).
Je pense donc que cela vient du buffer, je ne sais pas si c'est correcte comme je fais dans le code suivant : (la seule différence entre le code du PCA et du PCB, c'est que l'appel de fonctions send et receive est inversé.

Voici le code du pc A :

Code:

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

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS0" 
#define _POSIX_SOURCE 1 /* code source conforme à POSIX */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;
volatile int DEBUG=TRUE;
volatile int fd;
volatile struct termios oldtio, SNDtio, RCVtio;
int main(void)
{ 
 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);   // ouverture de la connexion RS232 (COM1 | read/write | pas comme terminal de controle)
 if (fd < 0)
 {
  perror(MODEMDEVICE);     // erreur à l'ouverture de la connexion
  exit(-1);      // quit
 }
 
 tcgetattr(fd, &oldtio);      // sauvegarde de la structure de configuration courante
 
 /* Configuration de la structure d'envoi */
 bzero(&SNDtio, sizeof(SNDtio));     // vide la structure SNDtio
 SNDtio.c_cflag = BAUDRATE | CRTSCTS | CS7 | PARENB | CLOCAL | CREAD; // 38400 bps | control de flux RTS/CTS (pas dans posix) | 7 bits données | parité paire | permet de garder le port ouvert malgrè une déconnexion | active le mode lecture
 SNDtio.c_iflag = IGNPAR;     // ignore les caractères avec erreur de parité
 SNDtio.c_oflag = 0;      // pas de mode de sortie particulier
 
 
 /* Configuration de la structure de réception */
 bzero(&RCVtio, sizeof(RCVtio));     // vide la structure RCVtio
 RCVtio.c_cflag = BAUDRATE | CRTSCTS | CS7 | PARENB | CLOCAL | CREAD; // 38400 bps | control de flux RTS/CTS (pas dans posix) | 7 bits données | parité paire | permet de garder le port ouvert malgrè une déconnexion | active le mode lecture
 RCVtio.c_iflag = IGNPAR;     // ignore les caractères avec erreur de parité
 RCVtio.c_oflag = 0;      // pas de mode de sortie particulier
 RCVtio.c_lflag = ECHO;      // mode de lecture non-canonique avec echo
 
 RCVtio.c_cc[VTIME] = 0;      // timer inter-caractères non utilisé
 RCVtio.c_cc[VMIN] = 2;      // read bloquant jusqu'à ce qu'1 caractère soit lu
 
 tcflush(fd, TCOFLUSH);      // vide le tampon d'écriture
 tcflush(fd, TCIFLUSH);      // vide le tampon de lecture
 
 send_serial();
 //tcflush(fd, TCOFLUSH);     // vide le tampon d'écriture
 //tcflush(fd, TCIFLUSH);      // vide le tampon de lecture
 
 sleep(0,1);
 receive_serial();
}

int send_serial(void)
{
 /* Déclaration des variables */
 char SNDstring[255];
 //tcflush(fd, TCOFLUSH);
 tcsetattr(fd, TCSANOW, &SNDtio);    // affecte la configuration d'écriture
 
 gets(SNDstring);      // demande à l'utilisateur la valeur à écrire
 write(fd,SNDstring,strlen(SNDstring));    // écriture de la valeur
 sleep(0,1);      // pause d'1/10 de sec 
 strcpy(SNDstring,"");
 tcsetattr(fd, TCSANOW, &oldtio);    // réaffectation de la configuration initiale
}

int receive_serial(void)
{
 /* Déclaration des variables */
 int res;
 char RCVstring[255];
 
 tcsetattr(fd, TCSANOW, &RCVtio);    // affecte la nouvelle configuration

 res = read(fd,RCVstring,255);     // retourne après la lecture
 printf("n");
 printf("%in", res);
 printf("%sn", RCVstring);
 RCVstring[res] = 0;      // 0 dans le dernier élément du tableau pour pouvoir l' imprimer...
 if (DEBUG == TRUE)
 {
  printf("recu :%sn", RCVstring);
 }
 
 tcsetattr(fd, TCSANOW, &oldtio);    // réaffectation de la configuration initiale
 //tcflush(fd, TCIFLUSH);
}

Merci d'avance pour votre aide.

Hors ligne

 

#2 17 Feb 2005 15:59:03

smilebob
Apôtre du libre
 
Lieu: Sévenans, Territoire de Belfor
Date d'inscription: 23 Sep 2004
Messages: 81
Site web

Re: [RS232] Problème de connexion

Ah, RS2323, le bon  vieux temps, j'ai jamais programmé de liaison RS232 sous notre OS préféré, seulement sur des DSP et sous Win big_smile mais je vais essayer de debugger tout ca, je te tiens au courant, ca me fera révisé, apres 6 mois de stage ca va me faire du bien smile


LinuX c'est bien tout seul et c'est encore mieux à plusieurs smile
http://smilebob.ath.cx

Hors ligne

 

Pied de page des forums

Powered by FluxBB