Pb sur liaison rs232

cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 - 21 avril 2004 à 20:34
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 - 26 avril 2004 à 23:56
Bonjour à tous !
En quelques mots la situation :
je suis stagiaire, l'un de mes projets est d' "espionner" les échanges entre un automate et un pc(console graphique) sur port com. Je travaille sous dev-cpp mais j'ai dû utiliser des instructions assembleur (AT&T, désolé) afin d'aboutir à un résultat...
Tout semblait bien fonctionnait sauf que l'execution de mon programme est considérée par les machines comme une défaillance des échanges.

Quelqu'un aurait-il ne serait-ce qu'une vague idée du problème ???

Merci d'avance

12 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
22 avril 2004 à 17:00
salut,

c sur quel OS ?
peux-tu envoyer ton source ?
j'ai déjà travaillé sur un hooker de port com ( sous windows ) donc je pourrais peut etre t'aider.

@++
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
23 avril 2004 à 14:45
salut et merci d'avoir répondu patatalo !

voici ma source, c'est pas grand chose, pour l'instant un simple essai.

#include
#include <stdlib.h>
#include <conio.c>
#include <windows.h>

using namespace std;
unsigned int adr=0x3F8; // adresse du port com1
unsigned char ret_char; // caractère lu sur le port
unsigned char ctrl_char; // mémoire du caractère précédent
int main(void)
{
int touche; // touche pressée par l'utilisateur
while (touche!=27)
{
// instructions assembleur
#pragma inline
asm("movl _adr, %edx");
asm("in %dx, %al");
asm("movb %al, _ret_char");

// le caractère lu ne sera affiché que s'il est changé
if (ret_char!=ctrl_char)
{
printf("%2X\n", ret_char);
Sleep(10); // rafraichissement de la lecture
}
ctrl_char=ret_char; // passage du caractère lu en mémoire
}
return 0;
}

une précision, cependant, il m'a été impossible de capter la moindre info par une lecture plus classique en C++ du port com du type ... CreateFile("COM1",....)....
Je commence à avoir des doutes sur le port, ce pourrait être un RS485... je manque cruellement de doc sur l'installation

Encore merci...
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
23 avril 2004 à 14:47
ouppps

en relisant ton message et le mien, je viens de m'appercevoir que j'avais oublié de préciser que le pc servant de console graphique tournait sous Windows98...

Voilà qui est fait ;-)

6co
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
23 avril 2004 à 16:47
salut,

le fonctionnement du port COM n'est pas aussi simple que ça
déjà, il faut que tu règle la vitesse, le nombre de bits de données, la parité, le nombre de bits d'arret.
ensuite, si le port com est réglé pour fonctionner en mode interruption, tu dois hooker l'interruption dans la IDT.

avant de lire les données directement, je pense que tu dois pouvoir interroger le port com sur la présence de caracteres mais je me rappelle plus comment on fait, je regarderai...

la deuxieme methode que je peux te proposer et qui a mon avis sera beaucoup + valable sera de hooker les fonctions d'entrée/sortie du driver VCOMM.VXD.
Je vais essayer de retrouver le source de mon prog ( que de l'assembleur ) afin de faire cela et le posterai en code source.

@++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
23 avril 2004 à 17:44
excuse moi, je manque de vocabulaire, qu'entend tu par hooker ???

concernant la vitesse, le nombre de bits, la parité, les bits d'arrêt, j'avais écrit un autre code reprenant la méthode CreateFile en C++. Je ne l'ai pas sous la main mais en gros, il testé toutes les combinaisons possibles de ces tableaux de paramètres

Vitesse : de env 1400 (je crois) à env 115000
(données reprises sur une doc)
Bits donnnées : de 5 à 8
Parité (aucune, paire ,impaire)
Bit stop : aucun, 1 ou 2

Le test se stopper à la lecture de la moindre donnée. Aucun résultat.
J'attends avec impatience ton code (ou une petite explication sur l'interruption dans la IDT)...

En tout cas, mille fois merci

6co
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
24 avril 2004 à 12:35
salut,

3FD Registre d’état de la ligne (lsr)
Ce registre permet de donner des informations sur le transfert
des données,

Bit 0 DR (Data Ready)
Si ce bit est à 1 alors une donnée reçue est prête.
Remis à 0 par lecture des données ou forçage.

Bit 1 OE (Over run Error)
Un écrasement de données a eu lieu car la lecture n’a
pas été faite à temps.

Bit 2 PE (Parity Error)
Mauvaise parité à la réception.

Bit 3 FE (Framing Error)
Erreur avec les bits de stop.

Bit 4 BI (Break Interrupt)
Erreur de transmission.

Bit 5 THRE (Transmitter Holding Register Empty)
Le 8250 est prêt à accepter un nouveau caractère.

Bit 6 TSRE (Transmitter Shift Register Empty)
Ce bit ne peut être que lu.

Bit 7 Toujours à 0.

@++
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
24 avril 2004 à 15:55
salut,

plus concretement,
veux tu dire que je dois lire le registre 3FD, vérifier le bit DR et lire ma valeur comme avant...? parce qu'il faut bien que je la lise ma valeur sur le 3F8.

En fait, ce que j'aimerais lire, ce ne sont pas des mots définis, je voudrais juste obtenir qulques valeurs et faire l'analogie avec les mouvements de l'automate...

Ce que j'aimerais savoir, c'est si les instructions que j'utilisais risquait d'influencer les valeurs lues par un programme tierce (celui de la console)...
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
24 avril 2004 à 16:19
salut,

effectivement, je pense que tu dois lire les valeures sur le port 3F8 seulement si une donnée est indiquée présente sur le port 3FD.

de plus, si tu lis le port 3F8 tu vide le tampon en meme temps et donc, ces données ne sont plus récupérable par le logiciel de l'automate.

hook signifie crochet.
autrement dit, toi tu accede au port com mais ton logiciel pour l'automate non, il n'accede qu'a tes fonctions hook.

avant:
COM<->LOG AUTOMATE
apres:
COM<->PROG HOOK(BUFFER)<->LOG AUTOMATE

j'essaierai de te poster le code source ce soir. Il fonctionnait très bien avec un modem donc je pense que ca devrait faire la balle aussi dans ton cas.

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
26 avril 2004 à 11:58
salut,

je poste le source de suite

@++
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
26 avril 2004 à 14:03
ok patatalo, je vais y jeter un œil et je te tiens au courant dans les plus bref délais ;-)

6co
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
26 avril 2004 à 17:47
excuse moi patatalo, j'ai un grand service à te demander, impossible d'accéder au téléchargement du ddk98 (#$*%@ de passport .net), rien à faire...

pourrais tu s'il te plait m'envoyer le tien par mail ceesco@free.fr

excuse moi encore

6co
0
cs_6co Messages postés 114 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 5 avril 2012 1
26 avril 2004 à 23:56
finalement j'ai trouvé le ddk ailleurs merci encore patatalo
0
Rejoignez-nous