J'ai une appli qui dialogue avec un automate via un port série ouvert
par CreateFile().
Seulement sur certains PC, heureusement assez rares, et quelle que soit
la version de Windows (en tout cas ça le fait aussi bien avec 98 que
XP), il arrive que CreateFile() échoue lorsque l'appli a été lancée pour
la 3ème ou 4ème fois - parfois plus - avec INVALID_HANDLE_VALUE
retournée.
J'ai une appli qui dialogue avec un automate via un port série ouvert
par CreateFile().
Seulement sur certains PC, heureusement assez rares, et quelle que soit
la version de Windows (en tout cas ça le fait aussi bien avec 98 que
XP), il arrive que CreateFile() échoue lorsque l'appli a été lancée pour
la 3ème ou 4ème fois - parfois plus - avec INVALID_HANDLE_VALUE
retournée.
J'ai une appli qui dialogue avec un automate via un port série ouvert
par CreateFile().
Seulement sur certains PC, heureusement assez rares, et quelle que soit
la version de Windows (en tout cas ça le fait aussi bien avec 98 que
XP), il arrive que CreateFile() échoue lorsque l'appli a été lancée pour
la 3ème ou 4ème fois - parfois plus - avec INVALID_HANDLE_VALUE
retournée.
// Ici, j'utilise les MFC.
HANDLE h > ::CreateFile((LPCTSTR)sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h == INVALID_HANDLE_VALUE)
{
sPort.Format(_T("\.COM%d"),m_ComPort); //Format sous NT.
h= ::CreateFile((LPCTSTR)sPort,
GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h== INVALID_HANDLE_VALUE)
{
// gestion d'erreur
}
}
Utilisez vous ::ClearComError() et ::PurgeComm() ?
Si vous soupçonnez une discordance "matérielle" sur ces machines,
essayez de nettoyer les signaux avec ::EscapeCommFunction();
// Ici, j'utilise les MFC.
HANDLE h > ::CreateFile((LPCTSTR)sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h == INVALID_HANDLE_VALUE)
{
sPort.Format(_T("\\.\COM%d"),m_ComPort); //Format sous NT.
h= ::CreateFile((LPCTSTR)sPort,
GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h== INVALID_HANDLE_VALUE)
{
// gestion d'erreur
}
}
Utilisez vous ::ClearComError() et ::PurgeComm() ?
Si vous soupçonnez une discordance "matérielle" sur ces machines,
essayez de nettoyer les signaux avec ::EscapeCommFunction();
// Ici, j'utilise les MFC.
HANDLE h > ::CreateFile((LPCTSTR)sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h == INVALID_HANDLE_VALUE)
{
sPort.Format(_T("\.COM%d"),m_ComPort); //Format sous NT.
h= ::CreateFile((LPCTSTR)sPort,
GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h== INVALID_HANDLE_VALUE)
{
// gestion d'erreur
}
}
Utilisez vous ::ClearComError() et ::PurgeComm() ?
Si vous soupçonnez une discordance "matérielle" sur ces machines,
essayez de nettoyer les signaux avec ::EscapeCommFunction();
// Ici, j'utilise les MFC.
HANDLE h >> ::CreateFile((LPCTSTR)sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
Je suis toujours sur mon vieux Borland, mais je pense que mon appel de
CreateFile() est identique.
Et c'est là que ça coince, pas dans la suite
des événements. Je pige pas pourquoi CreateFile() retourne
INVALID_HANDLE_VALUE au bout d'un certain nombre de relances du programme.
if(h == INVALID_HANDLE_VALUE)
{
sPort.Format(_T("\.COM%d"),m_ComPort); //Format sous NT.
h= ::CreateFile((LPCTSTR)sPort,
GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h== INVALID_HANDLE_VALUE)
{
// gestion d'erreur
}
}
Pourquoi ce 2ème essai avec les même arguments ? Que fait cette fonction
Format() sous NT ?
Apparemment, ClearCommError(), ClearCommBreak(), PurgeComm(), etc. ont
besoin d'un handle, justement. Vous voulez dire qu'il faut les appeler
avant de faire CloseHandle() et fermer le programme ?
Si vous soupçonnez une discordance "matérielle" sur ces machines,
essayez de nettoyer les signaux avec ::EscapeCommFunction();
Non, c'est vraiment le CreateFile() qui veut pas.
// Ici, j'utilise les MFC.
HANDLE h >> ::CreateFile((LPCTSTR)sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
Je suis toujours sur mon vieux Borland, mais je pense que mon appel de
CreateFile() est identique.
Et c'est là que ça coince, pas dans la suite
des événements. Je pige pas pourquoi CreateFile() retourne
INVALID_HANDLE_VALUE au bout d'un certain nombre de relances du programme.
if(h == INVALID_HANDLE_VALUE)
{
sPort.Format(_T("\\.\COM%d"),m_ComPort); //Format sous NT.
h= ::CreateFile((LPCTSTR)sPort,
GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h== INVALID_HANDLE_VALUE)
{
// gestion d'erreur
}
}
Pourquoi ce 2ème essai avec les même arguments ? Que fait cette fonction
Format() sous NT ?
Apparemment, ClearCommError(), ClearCommBreak(), PurgeComm(), etc. ont
besoin d'un handle, justement. Vous voulez dire qu'il faut les appeler
avant de faire CloseHandle() et fermer le programme ?
Si vous soupçonnez une discordance "matérielle" sur ces machines,
essayez de nettoyer les signaux avec ::EscapeCommFunction();
Non, c'est vraiment le CreateFile() qui veut pas.
// Ici, j'utilise les MFC.
HANDLE h >> ::CreateFile((LPCTSTR)sPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
Je suis toujours sur mon vieux Borland, mais je pense que mon appel de
CreateFile() est identique.
Et c'est là que ça coince, pas dans la suite
des événements. Je pige pas pourquoi CreateFile() retourne
INVALID_HANDLE_VALUE au bout d'un certain nombre de relances du programme.
if(h == INVALID_HANDLE_VALUE)
{
sPort.Format(_T("\.COM%d"),m_ComPort); //Format sous NT.
h= ::CreateFile((LPCTSTR)sPort,
GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(h== INVALID_HANDLE_VALUE)
{
// gestion d'erreur
}
}
Pourquoi ce 2ème essai avec les même arguments ? Que fait cette fonction
Format() sous NT ?
Apparemment, ClearCommError(), ClearCommBreak(), PurgeComm(), etc. ont
besoin d'un handle, justement. Vous voulez dire qu'il faut les appeler
avant de faire CloseHandle() et fermer le programme ?
Si vous soupçonnez une discordance "matérielle" sur ces machines,
essayez de nettoyer les signaux avec ::EscapeCommFunction();
Non, c'est vraiment le CreateFile() qui veut pas.
> Je dois dire que je n'ai jamais constaté ce problème.
Faites vous une configuration complète du port, ::SetCommState,
::SetupComm() et ::SetCommTimeouts() ?
Sous NT, le port COM peut s'adresser de cette façon, < .COM1 >;
Enfin, je crois, puisque je n'en trouve plus la trace dans la MSDN.
Il faut appeler ::ClearCommError() pour basculer les drapeaux après
chaque erreur, sinon, le port n'autorise plus d'opération.
En fait, il est aussi utilisé pour lire l'état du port après une
opération ou attendre la présence d'un signal sur le port.
do
{
::ClearCommError(h,&dw_Err,&s_comstat);
} while(s_comstat.cbOutQue==0 ); // && !TimeOut, le cas échéant.
Est-ce que vous pouvez utiliser le port avec un autre logiciel, après
les plantage? voire même avec un
$ echo test > com1 .
> Je dois dire que je n'ai jamais constaté ce problème.
Faites vous une configuration complète du port, ::SetCommState,
::SetupComm() et ::SetCommTimeouts() ?
Sous NT, le port COM peut s'adresser de cette façon, < \.COM1 >;
Enfin, je crois, puisque je n'en trouve plus la trace dans la MSDN.
Il faut appeler ::ClearCommError() pour basculer les drapeaux après
chaque erreur, sinon, le port n'autorise plus d'opération.
En fait, il est aussi utilisé pour lire l'état du port après une
opération ou attendre la présence d'un signal sur le port.
do
{
::ClearCommError(h,&dw_Err,&s_comstat);
} while(s_comstat.cbOutQue==0 ); // && !TimeOut, le cas échéant.
Est-ce que vous pouvez utiliser le port avec un autre logiciel, après
les plantage? voire même avec un
$ echo test > com1 .
> Je dois dire que je n'ai jamais constaté ce problème.
Faites vous une configuration complète du port, ::SetCommState,
::SetupComm() et ::SetCommTimeouts() ?
Sous NT, le port COM peut s'adresser de cette façon, < .COM1 >;
Enfin, je crois, puisque je n'en trouve plus la trace dans la MSDN.
Il faut appeler ::ClearCommError() pour basculer les drapeaux après
chaque erreur, sinon, le port n'autorise plus d'opération.
En fait, il est aussi utilisé pour lire l'état du port après une
opération ou attendre la présence d'un signal sur le port.
do
{
::ClearCommError(h,&dw_Err,&s_comstat);
} while(s_comstat.cbOutQue==0 ); // && !TimeOut, le cas échéant.
Est-ce que vous pouvez utiliser le port avec un autre logiciel, après
les plantage? voire même avec un
$ echo test > com1 .
> Est-ce que vous pouvez utiliser le port avec un autre logiciel, après
> les plantage? voire même avec un
> $ echo test > com1 .
Ah ouais, bonne question. J'ai même pas essayé l'HyperTerminal, focalisé
que j'étais sur mon programme. Je cours essayer !
> Est-ce que vous pouvez utiliser le port avec un autre logiciel, après
> les plantage? voire même avec un
> $ echo test > com1 .
Ah ouais, bonne question. J'ai même pas essayé l'HyperTerminal, focalisé
que j'étais sur mon programme. Je cours essayer !
> Est-ce que vous pouvez utiliser le port avec un autre logiciel, après
> les plantage? voire même avec un
> $ echo test > com1 .
Ah ouais, bonne question. J'ai même pas essayé l'HyperTerminal, focalisé
que j'étais sur mon programme. Je cours essayer !
Sous NT, le port COM peut s'adresser de cette façon, < .COM1 >;
Enfin, je crois, puisque je n'en trouve plus la trace dans la MSDN.
Je crois que je vais négliger cette étape. A mon avis, le problème vient
d'ailleurs, probablement de la façon dont je ferme le port et termine le
programme.
Je fais juste un CloseHandle() dans le destructeur de ma
fenêtre d'appli, et rien d'autre. Peut-être qu'il faut y ajouter les
fonctions Kärcher que vous m'avez indiquées. Je vais aller essayer sur
site.
Avant mon CloseHandle(), j'envoie un dernier télégramme pour remettre
l'automate au repos. Ce télégramme part bien, et il est tout aussi bien
acquitté. Donc il n'y a pas d'erreur à ce moment-là.
A la limite, ça se
produirait sur tous les PC et tout le temps ; pas juste sur quelques uns
au bout de 3 ou 4 exécution du programme. Curieux, non ?
Sous NT, le port COM peut s'adresser de cette façon, < \.COM1 >;
Enfin, je crois, puisque je n'en trouve plus la trace dans la MSDN.
Je crois que je vais négliger cette étape. A mon avis, le problème vient
d'ailleurs, probablement de la façon dont je ferme le port et termine le
programme.
Je fais juste un CloseHandle() dans le destructeur de ma
fenêtre d'appli, et rien d'autre. Peut-être qu'il faut y ajouter les
fonctions Kärcher que vous m'avez indiquées. Je vais aller essayer sur
site.
Avant mon CloseHandle(), j'envoie un dernier télégramme pour remettre
l'automate au repos. Ce télégramme part bien, et il est tout aussi bien
acquitté. Donc il n'y a pas d'erreur à ce moment-là.
A la limite, ça se
produirait sur tous les PC et tout le temps ; pas juste sur quelques uns
au bout de 3 ou 4 exécution du programme. Curieux, non ?
Sous NT, le port COM peut s'adresser de cette façon, < .COM1 >;
Enfin, je crois, puisque je n'en trouve plus la trace dans la MSDN.
Je crois que je vais négliger cette étape. A mon avis, le problème vient
d'ailleurs, probablement de la façon dont je ferme le port et termine le
programme.
Je fais juste un CloseHandle() dans le destructeur de ma
fenêtre d'appli, et rien d'autre. Peut-être qu'il faut y ajouter les
fonctions Kärcher que vous m'avez indiquées. Je vais aller essayer sur
site.
Avant mon CloseHandle(), j'envoie un dernier télégramme pour remettre
l'automate au repos. Ce télégramme part bien, et il est tout aussi bien
acquitté. Donc il n'y a pas d'erreur à ce moment-là.
A la limite, ça se
produirait sur tous les PC et tout le temps ; pas juste sur quelques uns
au bout de 3 ou 4 exécution du programme. Curieux, non ?
Ce qui me gène, c'est que je ne me souviens plus pourquoi je fais ce
deuxième appel.
Je ne trouve pas mention de cette écriture dans la MSDN, du moins par
pour les ports de type série. Pire, d'après ce que je lis, cette
écriture n'est pas valide pour un port de communication.
Ce qui me gène, c'est que je ne me souviens plus pourquoi je fais ce
deuxième appel.
Je ne trouve pas mention de cette écriture dans la MSDN, du moins par
pour les ports de type série. Pire, d'après ce que je lis, cette
écriture n'est pas valide pour un port de communication.
Ce qui me gène, c'est que je ne me souviens plus pourquoi je fais ce
deuxième appel.
Je ne trouve pas mention de cette écriture dans la MSDN, du moins par
pour les ports de type série. Pire, d'après ce que je lis, cette
écriture n'est pas valide pour un port de communication.