E/S sur port série

cs_Gaelle Messages postés 41 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 7 mars 2004 - 1 avril 2002 à 14:16
bryg Messages postés 9 Date d'inscription mercredi 27 mars 2002 Statut Membre Dernière intervention 15 mai 2002 - 19 avril 2002 à 16:31
Salut

Mon prog (sous VC++6) gère le port serie pour l'envoi et la reception d'info. J'utilise pour cela les fonctions _outp(PORT, int) et _inp(PORT)
Mon prog tourne à peu près sous 98 mais pas du tout sous NT ! Autre problème comment gérer l'envoi d'une chaine de caractère. L'envoi en format int ne pose aucun problème... Donc en castant ma chaine en int (fct atoi(...)) j'obtient toujours 0 comme resultat de reception. J'ai donc changé de méthode mais sans plus de résultat ! Si qq à une petite idée...

Voici les fonctions d'envoi et de reception:

/*Definition des constantes*/
/*-------------------------*/
#define PORT 0x03FF
#define MAX_BUFFER 100

/*-------------------------------------------------------------------------------
Fonction associee au bouton envoyer. Elle recupere la chaine de caractere
saisie dans la fenetre d'envoi et la transmet au port série.
---------------------------------------------------------------------------------*/
void CPortSerieDlg::OnButtonEnvoyer()
{
/*Initialisation des variables buffer pour recuperation et
cast en type int
----------------------------------------------------------*/
CString buff;
char buffb[MAX_BUFFER];

/*Recuperation du texte et mise à blanc de la zone de saisie*/
/*----------------------------------------------------------*/
m_edit_envoi.GetWindowText(buff);
m_edit_envoi.SetWindowText("");

/*Copie dans le second buffer pour le premier changement de type*/
/*--------------------------------------------------------------*/
strcpy(buffb, buff);

/*Envoi au port série en castant le type au format int*/
/*----------------------------------------------------*/
_outpw(PORT, int(buffb));
}

/*---------------------------------------------------------------------------------
Fonction associée au bouton receptionner. Elle se charge de recuperer les infos
qui sont dans le buffer du port serie.
-----------------------------------------------------------------------------------*/
void CPortSerieDlg::OnButtonReceptionner()
{
/*Initialisation de variable buffer pour la recuperation
des informations du port.
---------------------------------------------------------*/
int res=1;
char buff[MAX_BUFFER];

/*Recuperation de l'envoi du port. L'infos est de type int*/
/*--------------------------------------------------------*/
res = _inp(PORT);

/*Cast de l'information en chaine de caractères*/
/*---------------------------------------------*/
/*Meme en utilisant itoa(...,10) le resultat decodé est incorrect*/
strcpy(buff,(char*)(res));

/*Affichage des infos dans la fenetre reception*/
/*---------------------------------------------*/
m_edit_reception.SetWindowText (buff);
}

Merci à vous tous bisous bisous, Gaëlle

3 réponses

cs_electrix Messages postés 3 Date d'inscription vendredi 13 octobre 2000 Statut Membre Dernière intervention 3 avril 2002
3 avril 2002 à 14:17
Salut Gaelle,

Helas tu utilise les inport et outport d'acces direct au hardware de la machine, hors sous NT comme pour 2000, il y a une couche intermediaire dite "d'abstraction materiel" ou couche "H.A.L" (HardWare Abstract Layer) qui interdit justement tout acces direct au matos !
Par consequent tu doit passer par des fonctions API et d'acces I/O type CreateFile en OVERLAPPED ou NON-OVERLAPPED au choix (le NON-OVERLAPPED dans ton cas).
Je te conseil plusieurs docs html et samples de chez microsoft que j'utilise pour les acces au port serie:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecomm/htm/serial_1.asp

Et Oui, on sait pourquoi le copier/coller existe quand on voit les URLs a rallonge ;c)

bon courage ... et bonne prog :c)
xavier.
0
bryg Messages postés 9 Date d'inscription mercredi 27 mars 2002 Statut Membre Dernière intervention 15 mai 2002
19 avril 2002 à 16:29
-------------------------------
Réponse au message :
-------------------------------

Salut

Mon prog (sous VC++6) gère le port serie pour l'envoi et la reception d'info. J'utilise pour cela les fonctions _outp(PORT, int) et _inp(PORT)
Mon prog tourne à peu près sous 98 mais pas du tout sous NT ! Autre problème comment gérer l'envoi d'une chaine de caractère. L'envoi en format int ne pose aucun problème... Donc en castant ma chaine en int (fct atoi(...)) j'obtient toujours 0 comme resultat de reception. J'ai donc changé de méthode mais sans plus de résultat ! Si qq à une petite idée...

Voici les fonctions d'envoi et de reception:

/*Definition des constantes*/
/*-------------------------*/
#define PORT 0x03FF
#define MAX_BUFFER 100

/*-------------------------------------------------------------------------------
Fonction associee au bouton envoyer. Elle recupere la chaine de caractere
saisie dans la fenetre d'envoi et la transmet au port série.
---------------------------------------------------------------------------------*/
void CPortSerieDlg::OnButtonEnvoyer()
{
/*Initialisation des variables buffer pour recuperation et
cast en type int
----------------------------------------------------------*/
CString buff;
char buffb[MAX_BUFFER];

/*Recuperation du texte et mise à blanc de la zone de saisie*/
/*----------------------------------------------------------*/
m_edit_envoi.GetWindowText(buff);
m_edit_envoi.SetWindowText("");

/*Copie dans le second buffer pour le premier changement de type*/
/*--------------------------------------------------------------*/
strcpy(buffb, buff);

/*Envoi au port série en castant le type au format int*/
/*----------------------------------------------------*/
_outpw(PORT, int(buffb));
}

/*---------------------------------------------------------------------------------
Fonction associée au bouton receptionner. Elle se charge de recuperer les infos
qui sont dans le buffer du port serie.
-----------------------------------------------------------------------------------*/
void CPortSerieDlg::OnButtonReceptionner()
{
/*Initialisation de variable buffer pour la recuperation
des informations du port.
---------------------------------------------------------*/
int res=1;
char buff[MAX_BUFFER];

/*Recuperation de l'envoi du port. L'infos est de type int*/
/*--------------------------------------------------------*/
res = _inp(PORT);

/*Cast de l'information en chaine de caractères*/
/*---------------------------------------------*/
/*Meme en utilisant itoa(...,10) le resultat decodé est incorrect*/
strcpy(buff,(char*)(res));

/*Affichage des infos dans la fenetre reception*/
/*---------------------------------------------*/
m_edit_reception.SetWindowText (buff);
}

Merci à vous tous bisous bisous, Gaëlle

Salut Gaëlle,

Eh bien voilas,c pas pour dire, mais je suis un peu a cours d'idée, car je dois réaliser un programme un peux similaire au tien. Peux tu m'aide avec un exemple de ton source si il tourne sous NT.
Voila mon E-Mail : Nofrifr@yahoo.fr
Merci.a+
0
bryg Messages postés 9 Date d'inscription mercredi 27 mars 2002 Statut Membre Dernière intervention 15 mai 2002
19 avril 2002 à 16:31
-------------------------------
Réponse au message :
-------------------------------

Salut

Mon prog (sous VC++6) gère le port serie pour l'envoi et la reception d'info. J'utilise pour cela les fonctions _outp(PORT, int) et _inp(PORT)
Mon prog tourne à peu près sous 98 mais pas du tout sous NT ! Autre problème comment gérer l'envoi d'une chaine de caractère. L'envoi en format int ne pose aucun problème... Donc en castant ma chaine en int (fct atoi(...)) j'obtient toujours 0 comme resultat de reception. J'ai donc changé de méthode mais sans plus de résultat ! Si qq à une petite idée...

Voici les fonctions d'envoi et de reception:

/*Definition des constantes*/
/*-------------------------*/
#define PORT 0x03FF
#define MAX_BUFFER 100

/*-------------------------------------------------------------------------------
Fonction associee au bouton envoyer. Elle recupere la chaine de caractere
saisie dans la fenetre d'envoi et la transmet au port série.
---------------------------------------------------------------------------------*/
void CPortSerieDlg::OnButtonEnvoyer()
{
/*Initialisation des variables buffer pour recuperation et
cast en type int
----------------------------------------------------------*/
CString buff;
char buffb[MAX_BUFFER];

/*Recuperation du texte et mise à blanc de la zone de saisie*/
/*----------------------------------------------------------*/
m_edit_envoi.GetWindowText(buff);
m_edit_envoi.SetWindowText("");

/*Copie dans le second buffer pour le premier changement de type*/
/*--------------------------------------------------------------*/
strcpy(buffb, buff);

/*Envoi au port série en castant le type au format int*/
/*----------------------------------------------------*/
_outpw(PORT, int(buffb));
}

/*---------------------------------------------------------------------------------
Fonction associée au bouton receptionner. Elle se charge de recuperer les infos
qui sont dans le buffer du port serie.
-----------------------------------------------------------------------------------*/
void CPortSerieDlg::OnButtonReceptionner()
{
/*Initialisation de variable buffer pour la recuperation
des informations du port.
---------------------------------------------------------*/
int res=1;
char buff[MAX_BUFFER];

/*Recuperation de l'envoi du port. L'infos est de type int*/
/*--------------------------------------------------------*/
res = _inp(PORT);

/*Cast de l'information en chaine de caractères*/
/*---------------------------------------------*/
/*Meme en utilisant itoa(...,10) le resultat decodé est incorrect*/
strcpy(buff,(char*)(res));

/*Affichage des infos dans la fenetre reception*/
/*---------------------------------------------*/
m_edit_reception.SetWindowText (buff);
}

Merci à vous tous bisous bisous, Gaëlle

Salut Gaëlle,

Eh bien voilas,c pas pour dire, mais je suis un peu a cours d'idée, car je dois réaliser un programme un peux similaire au tien. Peux tu m'aide avec un exemple de ton source si il tourne sous NT.
Voila mon E-Mail : Nofrifr@yahoo.fr
Merci.a+
0
Rejoignez-nous