cs_6co
Messages postés114Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention 5 avril 2012
-
21 avril 2004 à 20:34
cs_6co
Messages postés114Date d'inscriptionlundi 27 janvier 2003StatutMembreDerniè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 ???
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
cs_6co
Messages postés114Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention 5 avril 20121 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...
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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.
@++
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_6co
Messages postés114Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention 5 avril 20121 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)...
cs_6co
Messages postés114Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention 5 avril 20121 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)...
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.