Forum Clubic

Problème d'ouverture de port com

Bonjour,

j’espère que mon message et bien au bon endroit sinon je fais confiance aux modérateurs pour me rediriger.

Voila mon problème ne semble pas être de programmation mais plus une erreur de windows ou matériel, mais pour être sur je poste mon CODE quand même.

SUr une fonction Windows mon code plante. Je tente d’ouvrir une connection avec un certain nombre de ports COM ( pour être exacte avec 5 port COM)

Or de manière aléatoire mon Code boucle sur une certaine ligne.

Voici ma façon d’initialisé ma convection aux ports COM :

bool clPORT_COM::Init_LectureEcriture(void)
{
DCB dcb = {0};
BOOL OK;

hPortCom = CreateFile(Nom_Port.c_str(),
                       GENERIC_WRITE | GENERIC_READ,
                       0,
                       NULL,
                       OPEN_EXISTING,
                       0,
                       NULL);

    if(hPortCom != INVALID_HANDLE_VALUE)
    {
        OK = GetCommState(hPortCom, &dcb);

        if(OK)
        {
            dcb.BaudRate = Vitesse;
            dcb.ByteSize = NbDataBit;
            dcb.Parity = NOPARITY;
            dcb.StopBits = ONESTOPBIT;

        OK = SetCommState(hPortCom, &dcb);

                    if (OK)
                    {
                            COMMTIMEOUTS timeout;
                            timeout.ReadIntervalTimeout = MAXDWORD;
                            timeout.ReadTotalTimeoutMultiplier = MAXDWORD;
                            timeout.ReadTotalTimeoutConstant = 300;
                            timeout.WriteTotalTimeoutConstant = 300;
                            timeout.WriteTotalTimeoutMultiplier =  MAXDWORD;
                            OK = SetCommTimeouts(hPortCom, &timeout);
                    }
        }
    }
    else
    {
        OK = false;
    }

   return OK;

}
et voici comment j’appelle ma fonction :

bool CModule::Init()
{
if (com != NULL)
{
com->Fermer_Port();
delete com;
}

    lock = new TCriticalSection();
    com = new clPORT_COM(numPortCom, vitesse);
    bool connectionOuverte = com->Init_LectureEcriture();

    if (connectionOuverte)
    {
            AnsiString msg = "C0rn";
            Send( msg);
            Sleep(100);
            SetSoftIsReady(true);
    }
    else
    {
            AFermer = true;
    }

    moduleConnected = connectionOuverte;
    return connectionOuverte;

}
Or comme je vous l’ai déjà dis mon programme plante ( c’est a dire reste coincé dans la fonction ) a la ligne :

OK = SetCommState(hPortCom, &dcb);
de ma fonction clPORT_COM::Init_LectureEcriture(void)

Or cette fonction est une fonction Windows et comme je ne sort pas de la fonction je ne peut pas faire le fameux : GetLastError() me permettant de récupérer la cause de l’erreur.

Quel sont les causes qui pourrait faire planté cette fonction?

J’ai tenté de communiquer avec ces port COM avec un hyperterminal ( TERMITE) celui ci galère a ouvrir le port COM, il arrive même que cela plante.

Mais une fois arrivé a les ouvrir avec l’hyperterminal je n’ai aucun problème a les ouvrir avec mon logiciel.

EDIT : Je suis sous un PC Win 7 64 bits des fois que ça soit utile :stuck_out_tongue:

J’ai l’impression que tu dis “planter” quand le comportement est peut-être juste de la simple attente.

(note: je n’ai jamais ouvert de ports, qu’ils soient maritimes, ou COM ;))

l’attente est super longue, ce qui n’est pas un comportement normal. Tellement longue que je kill mon logiciel

Je sais pas si ca peut aider mais j’utilise des cables USB vers RS232.

Je n’y connais rien en port COM, donc je ne saurais te dire si c’est normal ou pas.

personne d’autre dans ce cas?