Bonjour à toutes, et à tous,

Je viens vers vous pour résoudre un problème sur mon développement de liaison série.

En effet, lors de l'écriture celui-ci me sort une erreur 998 qui semblerai d'après la MSDN être un problème de dépassement mémoire.
Google étant mon ami, j'ai bien sur fait toutes les recherches possibles pour trouver la solution (c'est plus rapide quand quelqu'un expose déjà le problème) et j'ai put remarquer des problèmes similaire sur le readFile, et ils font changé les flags de l'ouverture ce qui apparemment résolvais les problèmes de nos ami internaute.

J'ai bien vérifiés mes initialisations d'ouverture de port, et il me semble conforme a ce qu'ils répondent mais sans plus de succès.

Avant d'y placer mon code, peut être aussi que cela viens de là. Je n'ai pas de port série physique sur la tour ou je travail en ce moment.

Afin de parfaire mon logiciel (et en même temps faire une petite démo au jury) j'ai simulé deux ports série par un logiciel du nom de Eltima (payant, mais pour le moment en version d'évaluation), créé un petit logiciel de lecture de fichier csv de donné pré-enregistré qui envoie chaque trame ainsi formé par la liaison virtuel jusqu’à mon logiciel. Je me suis donc demandé si ça pouvais venir de la virtualisation mal faite.


Et voici donc mon code, (tout ce qu'il y'a de plus banal normalement):

Fonction d'initialisation et d'ouverture


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<s>Serial::Serial(const char* com, int bauds, int dataBits)
{
 
    DCB dcb;
    int neededSize = MultiByteToWideChar(CP_ACP, 0, com, -1, 0, 0);
 
    wchar_t* wideString = new wchar_t[neededSize];
 
    MultiByteToWideChar(CP_ACP, 0, com, -1, wideString, neededSize);
 
    //On ouvre le port comme un fichier. cf une utilisation d'un port com virtuel
    hCom = CreateFile(wideString, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
 
    //En cas de problème lors de l'ouverture, hCom = INVALID_HANDLE_VALUE = -1
    if(hCom == INVALID_HANDLE_VALUE)
    {
        qDebug(QString("Erreur d'ouverture du port Com, Valeur de hcom: ").toLatin1());
        delete this;
    }
 
    else
    {
        //Protection en cas d'un port série déja ouvert, permet de libérer le port
        PurgeComm( hCom ,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
 
        //============================================================
        //Paramétrage du port serie
 
        dcb.DCBlength = sizeof(DCB);
 
        GetCommState(hCom, &dcb);
 
        //Initialisation de la connexion
        dcb.BaudRate = bauds;
        dcb.ByteSize = dataBits;
 
        //Pour les tests, on désactive le controle
        dcb.fDtrControl = DTR_CONTROL_ENABLE;
 
        //On continu l'initialisation
        dcb.Parity = NOPARITY;
        dcb.StopBits = ONESTOPBIT;
 
        if(SetCommState(hCom, &dcb) == 0)
        {
            qDebug(QString("Erreur d'initialisation des paramétres du port").toLatin1());
 
        }
 
 
        //================================================================
    }
}</s>
Fonction d'écriture
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool Serial::fctWrite(unsigned char* data)
{
    DWORD BufferToWrite;
        if (hCom != NULL)
        {
            if(sizeof(data) > 0)
            {
                int error = WriteFile(hCom, data, sizeof(data), &BufferToWrite, NULL);
                if(error == 0)
                {
                    error = GetLastError();
                    qDebug(QString::number(error).toLatin1());
                    return false;
                }
                return true;
                CloseHandle(hCom);
            }
        }
}

Vous me direz sans doute, pourquoi sous Qt ne pas utiliser la librairie QextSerialPort.

Premièrement parce que lorsque j'ai tapé liaison série sur notre ami google au début je me suis arrêté au premier post qui me disais que ça n'était pas géré sous qt. Et enfin dernièrement, normalement (enfin je le croyais) je devais maitriser assez l'ouverture de liaison série pour perdre moins de temps qu'a comprendre une libraire annexe.

Merci d'avance pour l'aide que vous m'apporterez.
Michael