Précédent   Forum des professionnels en informatique > Systèmes > Linux > Matériel
Matériel Vos questions relatives à la configuration optimale et au support matériel
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/01/2008, 11h00   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 9
Points : 4
Points : 4
Par défaut Probleme de communication sur port serie

salut les gens,

Je post car j'ai un probleme qui me ronge ...
Voilaj'ai installé une carte pci multiport RS422,
apres avoir modifié un peu le driver
la carte semble marcher au poil.

Pas de probleme quand j'écris sur le port a partir d'une console avec une redirection
je lis parfaitement les données avec mon programme.
Mais lorsque j'écris a partir de mon programme je ne lis rien
Mais les données sont envoyées :
la fonction me renvoie le bon nombre de caracteres envoyés
Les stat. des ports (/proc/tty/driver/serial) m'indiquent les bons nombres de caracteres emis et recus sur chacun des ports

et enfin
si j'ecris N caractéres depuis mon programme
et que ensuite j'ecris M caracteres depuis une console
je lis N+M caractere sur mon port destinataire
dont les N premiers caracteres sont du nimporte quoi ...

Bref, le compteur de caractere seble s'incrementer mais il n'y a pas d'evenement "caractere dispo"
la fonction select me renvoie 0 = timeout

J'ai fais plein d'essais avec des option d'ouverture de fichier (/dev/ttySx) différentes
J'ai plus d'inspiration, pitié donnez un petit qqchose
campistrol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 12h09   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 776
Points : 7 776
puisque la carte marche, je penserai un probleme protocolaire....
ou de bit de fin ce genre de choses ...

comment causes ton programme au port serie ? par le periph ou par les fonctions Stty ?
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 12h21   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 9
Points : 4
Points : 4
d abord merci pour ton aide

je cause au port comme a un fichier :

Code :
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
 
*fh = open (filename, O_RDWR | O_NOCTTY | O_NDELAY)) < 0)
 
// pour la lecture :
 
timeout.tv_sec = 2;
		timeout.tv_usec = 100000;
		int selval;
		FD_SET (fh, &readfds);
		selval = select (fh+1, &readfds, NULL, NULL,(struct timeval *) &timeout);
		if (selval < 0)
			qWarning("Erreur select com %d fh %d  error %d", com, fh, errno);
		else
			qDebug("Select  %d", selval);
 
		if (FD_ISSET (fh, &readfds))
		{
			int len= read (fh, buffer, MAXTSLEN);
...
 
 
 
// Pour l'écriture
 
QString buff = "\01" + st + getcheck( st ) + "\r\n";	
	int retval;
	retval = write( fh, &buff[0], buff.length() );
	qDebug( "write %d octets",retval);
Bref qquechose de basic il me semblait
Un probleme protocolaire ... et bien c'est possible
mais je ne sais pas ou chercher car "\r\n" soit 0x0d et 0x0a me semblait suffir
s'il faut mettre autre chose quoi par exemple ??
et comment savoir quoi mettre ?? il y a t il une config a lire qque part ?

sinon j'ai fais des essais avec minicom :
le port qui aura été ouvert (puis fermé ou pas) par minicom
recoit par le programme le bon nombre de caractere
mais pas les bons

enfin si le probleme vient du driver je ne sais comment le resoudre
j'ai du changer l'io_region prevu a la base (2)
en le forcant à 0, sinon le driver ne marché par correctement
mais j'avais les memes problemes avant cette modif


merci pour ton attention
et n'hésite pas a repondre
toute piste m'intéresse
campistrol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 13h39   #4
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 776
Points : 7 776
bon désolé, mais j'aurai fait comme toi.... en l'utilisant comme "fichier"



ducoup je sais pas quoi te conseiller d'autre.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 15h27   #5
Invité de passage
 
Inscription : décembre 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 9
Points : 4
Points : 4
méa culpa

ct une coquille dans la fonction d'émission
j'envoyé un pointeur sur un QString et donc je recevais
nimporte quoi et je n'avais pas le caractere de fin de trame
d'ou toute cette merde

pour info :

ancienne fonction :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
QString buff = "\01" + st + getcheck( st ) + "\r\n";
	const char *disp = buff.toAscii().constData();
	//for(int i=0; i<buff.length(); i++)
		//qDebug("send mesge : [%02x] com %d fh %d       buff.length %d",
			//	 disp[i], com, fh, buff.length());
	qDebug("send mesge : [%s]      com %d       fh %d      buff.length %d",
				 disp, com, fh, buff.length());
	int retval;
	retval = write( fh, &buff[0], buff.length() );
	qDebug( "write : %d octets",retval);
nouvelle :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
QString buff = "\01" + st + getcheck( st ) + "\r\n";
	const char *disp = buff.toAscii().constData();
	//for(int i=0; i<buff.length(); i++)
		//qDebug("send mesge : [%02x] com %d fh %d       buff.length %d",
			//	 disp[i], com, fh, buff.length());
	qDebug("send mesge : [%s]      com %d       fh %d      buff.length %d",
				 disp, com, fh, buff.length());
	int retval;
	retval = write( fh, disp, buff.length() );
	qDebug( "write : %d octets",retval);

je suis pas trtés fier sur ce coup la
j'ai perdu du temps
mais j'ai appri plein de truc en fouillant nimporte ou !!

encore merci
campistrol est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h11.


 
 
 
 
Partenaires

Hébergement Web