OVH Cloud OVH Cloud

Déblocage port série

17 réponses
Avatar
SLO
Bonjour,

J'ai réalisé un petit programme en C pour communiquer par le port série avec
un montage à micro-controleur.

Mon problème est que lors d'un démarrage de session XP, il faut que je lance
un logiciel communicant avec le port série (Hyperterminal) pour débloquer le
port série.
En effet, sinon mon programme n'arrive pas à communiquer avec mon montage.

Après avoir lancé Hyper terminal et ouvert une connexion avec le port Com1,
j'arrête Hyperterminal et la je peux lancer mon prog autant de fois que je
veux et tout marche bien.

Comment faire pour débloquer le port série par mon programme ?

Merci d'avance
--
Nicolas

10 réponses

1 2
Avatar
Arnaud Debaene
SLO wrote:
Bonjour,


Bonjour.

J'ai réalisé un petit programme en C pour communiquer par le port
série avec un montage à micro-controleur.


<snip>
Comment faire pour débloquer le port série par mon programme ?



Montres nous ton code.

Arnaud
Avatar
Noé
"SLO" a écrit dans le message de
news:3f6c77ad$0$28879$
Bonjour,

J'ai réalisé un petit programme en C pour communiquer par le port série


avec
un montage à micro-controleur.

Mon problème est que lors d'un démarrage de session XP, il faut que je


lance
un logiciel communicant avec le port série (Hyperterminal) pour débloquer


le
port série.
En effet, sinon mon programme n'arrive pas à communiquer avec mon montage.

Après avoir lancé Hyper terminal et ouvert une connexion avec le port


Com1,
j'arrête Hyperterminal et la je peux lancer mon prog autant de fois que je
veux et tout marche bien.

Comment faire pour débloquer le port série par mon programme ?

Merci d'avance
--
Nicolas





Ne serait-ce pas plutot que ton programme ne configure pas correctement le
port série, et qu'une ouverture par HT soit requise pour effecter cette
configuration à sa place ?? Essaye de poster un bout de code pour voir si tu
n'as rien oublié.
Avatar
SLO
"Noé" a écrit dans le message de news:
bkjqqs$6g7$
Ne serait-ce pas plutot que ton programme ne configure pas correctement le
port série, et qu'une ouverture par HT soit requise pour effecter cette
configuration à sa place ?? Essaye de poster un bout de code pour voir si


tu
n'as rien oublié.



J'ouvre le port avec cet appel de fonction :

g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PAS_DE_PARITE,BIT_DE_STOP_1);


et voici la fonction OuvreCom :

e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int
StopBits)
{
g_ErrCom = e_ErrCom_None;

// On ouvre le port série
g_hCom = CreateFile(strPort,GENERIC_READ |
GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH |
FILE_FLAG_NO_BUFFERING,NULL);

if(g_hCom == INVALID_HANDLE_VALUE)
{
// Echec
g_ErrCom=e_ErrCom_Creation;
}
else
{
// On vide les buffers

PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

// On paramètre le port série
g_DCB.DCBlength = sizeof(DCB);
//Configuration actuelle
GetCommState(g_hCom, &g_DCB);
//Modification du DCB
g_DCB.BaudRateºudRate;
g_DCB.ByteSize=BitsSize;
g_DCB.Parity=Parity;
g_DCB.StopBits=StopBits;
g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
//Configuration de la liaison serie
SetCommState(g_hCom,&g_DCB);
}
return g_ErrCom;
}

Je précise que c'est une fonction qui n'est pas de moi (il faut rendre à
César... ;o) ).

Merci d'avance
--
Nicolas
Avatar
Noé
"SLO" a écrit dans le message de
news:3f6e059d$0$13273$

"Noé" a écrit dans le message de news:
bkjqqs$6g7$
> Ne serait-ce pas plutot que ton programme ne configure pas correctement


le
> port série, et qu'une ouverture par HT soit requise pour effecter cette
> configuration à sa place ?? Essaye de poster un bout de code pour voir


si
tu
> n'as rien oublié.

J'ouvre le port avec cet appel de fonction :

g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PAS_DE_PARITE,BIT_DE_STOP_1);


et voici la fonction OuvreCom :

e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int
StopBits)
{
g_ErrCom = e_ErrCom_None;

// On ouvre le port série
g_hCom = CreateFile(strPort,GENERIC_READ |
GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH |
FILE_FLAG_NO_BUFFERING,NULL);

if(g_hCom == INVALID_HANDLE_VALUE)
{
// Echec
g_ErrCom=e_ErrCom_Creation;
}
else
{
// On vide les buffers

PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

// On paramètre le port série
g_DCB.DCBlength = sizeof(DCB);
//Configuration actuelle
GetCommState(g_hCom, &g_DCB);
//Modification du DCB
g_DCB.BaudRateºudRate;
g_DCB.ByteSize=BitsSize;
g_DCB.Parity=Parity;
g_DCB.StopBits=StopBits;
g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
//Configuration de la liaison serie
SetCommState(g_hCom,&g_DCB);
}
return g_ErrCom;
}

Je précise que c'est une fonction qui n'est pas de moi (il faut rendre à
César... ;o) ).



AMHA,

- pas de test des valeurs de retour de GetCommState et SetCommState, ton
César ne doit pas se vanter...
- le DCB n'est pas complètement initialisé (CTS, DSR, ...)
- aucune mention des TIMEOUTs

Ce que je pourrais te conseiller (peu académique mais très instructif),
c'est de faire un GetCommState, puis d'afficher TOUS les paramètres, et ce
avant HyperTerminal, puis après. Tu verrais vite ce qui a été oublié par le
vieux Jules.


Merci d'avance
--
Nicolas





Ils sont fous ces...
Avatar
halfwolf
"Noé" wrote in message news:<bknics$1b4$...
AMHA,

- pas de test des valeurs de retour de GetCommState et SetCommState, ton
César ne doit pas se vanter...
- le DCB n'est pas complètement initialisé (CTS, DSR, ...)
- aucune mention des TIMEOUTs



A mon avis le problème vient des TIMEOUTs.

Ce que je pourrais te conseiller (peu académique mais très instructif),
c'est de faire un GetCommState, puis d'afficher TOUS les paramètres, et ce
avant HyperTerminal, puis après. Tu verrais vite ce qui a été oublié par le
vieux Jules.



Faire de même avec GetCommTimeouts.

HalfWolf
Avatar
SLO
"HalfWolf" a écrit dans le message de news:

Faire de même avec GetCommTimeouts.



Merci pour vos conseils.

J'ai ajouté un GetCommTimeouts et un GetCommState et j'ai comparé les
résultats avant et après lancement de HyperTerminal.

J'ai trouvé des différences et j'ai donc ajouté les mêmes paramètre de
Timeouts et CommState qu'après HyperTerminal avec les fonctions SetCommState
et SetCommTimeouts.

Mais ça ne marche pas...

En fait le PC arrive bien à écrire sur le port et mon montage reçoit bien
les données, mais dans l'autre sens ça ne marche toujours pas tant que je ne
lance pas HyperTerminal.

Que faire ? y a t il d'autres choses à paramétrer que CommState et
CommTimeouts ?

Merci d'avance
--
Nicolas
Avatar
halfwolf
"SLO" wrote in message news:<3f71f326$0$20618$...
En fait le PC arrive bien à écrire sur le port et mon montage reçoit bien
les données, mais dans l'autre sens ça ne marche toujours pas tant que je ne
lance pas HyperTerminal.



Peux-tu me montrer la partie de ton code qui fait la lecture et la
partie de ton code qui fait SetCommState et SetCommTimeouts ?

HalfWolf
Avatar
SLO
"HalfWolf" a écrit dans le message de news:

Peux-tu me montrer la partie de ton code qui fait la lecture et la
partie de ton code qui fait SetCommState et SetCommTimeouts ?



Voila, j'ai rajouté ça dans la fonction qui ouvre le port :

e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int
StopBits)
{
COMMTIMEOUTS g_Timeout;
g_ErrCom = e_ErrCom_None;

// On ouvre le port série
g_hCom = CreateFile(strPort,GENERIC_READ |
GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH |
FILE_FLAG_NO_BUFFERING,0);

if(g_hCom == INVALID_HANDLE_VALUE)
{
// Echec
g_ErrCom=e_ErrCom_Creation;

}
else
{
// On vide les buffers

PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

// On paramètre le port série
g_DCB.DCBlength = sizeof(DCB);
//Configuration actuelle
GetCommState(g_hCom, &g_DCB);

//Test
printf("DCBlength=%Xn",g_DCB.DCBlength);//Test
printf("BaudRate=%Xn",g_DCB.BaudRate);//Test
printf("fOutxCtsFlow=%Xn",g_DCB.fOutxCtsFlow);//Test
printf("fOutxDsrFlow=%Xn",g_DCB.fOutxDsrFlow);//Test
printf("fDtrControl=%Xn",g_DCB.fDtrControl);//Test
printf("fDsrSensitivity=%Xn",g_DCB.fDsrSensitivity);//Test
printf("fTXContinueOnXoff=%Xn",g_DCB.fTXContinueOnXoff );//Test
printf("fOutX=%Xn",g_DCB.fOutX);//Test
printf("fInX=%Xn",g_DCB.fInX);//Test
printf("fErrorChar=%Xn",g_DCB.fErrorChar);//Test
printf("fNull=%Xn",g_DCB.fNull);//Test
printf("fRtsControl=%Xn",g_DCB.fRtsControl);//Test
printf("fAbortOnError=%Xn",g_DCB.fAbortOnError);//Test
printf("fDummy2=%Xn",g_DCB.fDummy2);//Test
printf("XonLim=%Xn",g_DCB.XonLim);//Test
printf("XoffLim=%Xn",g_DCB.XoffLim);//test
printf("wReserved=%Xn",g_DCB.wReserved);//Test
printf("ByteSize=%Xn",g_DCB.ByteSize);//Test
printf("Parity=%Xn",g_DCB.Parity);//Test
printf("StopBits=%Xn",g_DCB.StopBits);//Test
printf("XonChar=%Xn",g_DCB.XonChar);//Test
printf("XoffChar=%Xn",g_DCB.XoffChar);//Test
printf("ErrorChar=%Xn",g_DCB.ErrorChar);//Test
printf("EofChar=%Xn",g_DCB.EofChar);//Test
printf("EvtChar=%Xn",g_DCB.EvtChar);//Test
printf("wReserved1=%Xn",g_DCB.wReserved1);//Test

GetCommTimeouts(g_hCom,&g_Timeout);
printf("ReadIntervalTimeout=%Xn",g_Timeout.ReadIntervalTimeout);

printf("ReadTotalTimeoutMultiplier=%Xn",g_Timeout.ReadTotalTimeoutMultiplie
r);

printf("ReadTotalTimeoutConstant=%Xn",g_Timeout.ReadTotalTimeoutConstant);

printf("WriteTotalTimeoutMultiplier=%Xn",g_Timeout.WriteTotalTimeoutMultipl
ier);

printf("WriteTotalTimeoutConstant=%Xn",g_Timeout.WriteTotalTimeoutConstant)
;
//Fin test

//Modification du DCB
g_DCB.BaudRateºudRate;
g_DCB.ByteSize=BitsSize;
g_DCB.Parity=Parity;
g_DCB.StopBits=StopBits;
g_DCB.fDtrControl=1;/*DTR_CONTROL_DISABLE;*/

g_DCB.fOutxCtsFlow=1;
g_DCB.fTXContinueOnXoff=1;
g_DCB.fRtsControl=2;
g_DCB.fAbortOnError=1;

//Configuration de la liaison serie
SetCommState(g_hCom,&g_DCB);

//Test
printf("DCBlength=%Xn",g_DCB.DCBlength);//Test
printf("BaudRate=%Xn",g_DCB.BaudRate);//Test
printf("fOutxCtsFlow=%Xn",g_DCB.fOutxCtsFlow);//Test
printf("fOutxDsrFlow=%Xn",g_DCB.fOutxDsrFlow);//Test
printf("fDtrControl=%Xn",g_DCB.fDtrControl);//Test
printf("fDsrSensitivity=%Xn",g_DCB.fDsrSensitivity);//Test
printf("fTXContinueOnXoff=%Xn",g_DCB.fTXContinueOnXoff );//Test
printf("fOutX=%Xn",g_DCB.fOutX);//Test
printf("fInX=%Xn",g_DCB.fInX);//Test
printf("fErrorChar=%Xn",g_DCB.fErrorChar);//Test
printf("fNull=%Xn",g_DCB.fNull);//Test
printf("fRtsControl=%Xn",g_DCB.fRtsControl);//Test
printf("fAbortOnError=%Xn",g_DCB.fAbortOnError);//Test
printf("fDummy2=%Xn",g_DCB.fDummy2);//Test
printf("XonLim=%Xn",g_DCB.XonLim);//Test
printf("XoffLim=%Xn",g_DCB.XoffLim);//test
printf("wReserved=%Xn",g_DCB.wReserved);//Test
printf("ByteSize=%Xn",g_DCB.ByteSize);//Test
printf("Parity=%Xn",g_DCB.Parity);//Test
printf("StopBits=%Xn",g_DCB.StopBits);//Test
printf("XonChar=%Xn",g_DCB.XonChar);//Test
printf("XoffChar=%Xn",g_DCB.XoffChar);//Test
printf("ErrorChar=%Xn",g_DCB.ErrorChar);//Test
printf("EofChar=%Xn",g_DCB.EofChar);//Test
printf("EvtChar=%Xn",g_DCB.EvtChar);//Test
printf("wReserved1=%Xn",g_DCB.wReserved1);//Test

//Test
g_Timeout.ReadIntervalTimeout=0xA;
g_Timeout.WriteTotalTimeoutConstant=0x1388;
SetCommTimeouts(g_hCom,&g_Timeout);
//Fin test


}
return g_ErrCom;
}

Merci encore pour le coup de main ;-)
--
Nicolas
Avatar
halfwolf
Salut,

en ajoutant

# include <windows.h>
# include <stdio.h>

typedef enum
{
e_ErrCom_None,
e_ErrCom_Creation,
} e_ErrCom;

e_ErrCom g_ErrCom;
HANDLE g_hCom;
DCB g_DCB;

avant ta fonction OuvreCom, et

int main(void)
{

OuvreCom("COM5", 19200, 8, NOPARITY, ONESTOPBIT);
if( g_ErrCom != e_ErrCom_None )
{
printf("Erreur lors de l'ouverture du port.n");
return EXIT_FAILURE;
}

while( 1 )
{
CHAR buffer[100];
DWORD nbBytesToTreat;
DWORD nbBytesTreated;
BOOL bRet;
DWORD i;

nbBytesToTreat = sizeof(buffer);
bRet = ReadFile(
g_hCom,
buffer,
nbBytesToTreat,
&nbBytesTreated,
NULL);
if( !bRet )
{
printf("Erreur lors de la lecture du port.n");
return EXIT_FAILURE;
}

printf("%lu caracteres lus :n", nbBytesTreated);
for( i = 0; i < nbBytesTreated; i++ )
{
printf("%.2X ", buffer[i]);
}
printf("n");
}


return EXIT_SUCCESS;
}

après, ça marche chez moi.

HalfWolf
Avatar
SLO
Merci et désolé pour la réponse tardive.
j'ai fait des modifications en tenant compte de ton dernier post, mais
ça ne marche toujours pas.
Cependant il faut que je regarde ça plus en détail ce week-end pour voir
si ça ne vient pas de mon code.

--
Nicolas


HalfWolf a écrit:
après, ça marche chez moi.

HalfWolf


1 2