Erreur de configuration du port COM, pour communication RS232

Résolu
StormEnnairo Messages postés 4 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 27 février 2012 - 24 févr. 2012 à 13:55
StormEnnairo Messages postés 4 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 27 février 2012 - 27 févr. 2012 à 18:42
Hello World ! (svp permettez moi ce jeu de mot à la noix)
Bon j'espère que quelqu'un poura maider, je débute en C, et j'assayes d'ecrire et lire des données dans le port com.
Après m'être plongé la dans des pages et des pages du manuel de l'API windows, de tutos en anglais et de m'être inspiré du travail de quelqu'un qui fonctionne (j'ai bien dit INSPIRE, pas plagié !), j'ai réussie à pondre mon propre code. Mais voila je n'arrive pas à configurer la variable de configuration du port com. Alors si quelqu'un trouve la connerie que je n'ai pas réussi à corrigé moi même (depuis deux jour et demie) dite le moi !
Merci de votre aide !

Voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define RX_SIZE         4096    //taille InPut
#define TX_SIZE         4096    // taille OutPut
#define MAX_WAIT_READ   5000    //temps max de lecture (en ms)

/*Declaration des fonctions que main utilisera
*/
    // Variable de Configuration des ports coms
    DCB PCConf  =
    {
        sizeof(DCB),        // DCBlength
        9600,               // BaudRate
        TRUE,               // fBinary
        FALSE,              // fParity
        FALSE,              // fOutxCtsFlow
        FALSE,              // fOutxDsrFlow
        DTR_CONTROL_ENABLE, // fDtrControl
        FALSE,              // fDsrSensitivity
        FALSE,              // fTXContinueOnXoff
        FALSE,              // fOutX
        FALSE,              // fInX
        FALSE,              // fErrorChar
        FALSE,              // fNull
        RTS_CONTROL_ENABLE, // fRtsControl
        FALSE,              // fAbortOnError
        0,                  // fDummy2
        0,                  // wReserved
        0x100,              // XonLim
        0x100,              // XoffLim
        8,                  // ByteSize
        NOPARITY,           // Parity
        ONESTOPBIT,         // StopBits
        0x11,               // XonChar
        0x13,               // XoffChar
        '?',                // ErrorChar
        0x1A,               // EofChar
        0x10                // EvtChar
    };

    // variable configuration des delay atentes des pots com
    COMMTIMEOUTS DelAtt =
        {
            MAX_WAIT_READ,  /* ReadIntervalTimeOut          */
            0,              /* ReadTotalTimeOutMultiplier   */
            MAX_WAIT_READ,  /* ReadTotalTimeOutConstant     */
            0,              /* WriteTotalTimeOutMultiplier  */
            0               /* WriteTotalTimeOutConstant    */
        };

int NCom = 0, nChoix, nBytesWritten, nBytesRead;
BOOL OpenCOM     (int NCom) ; // protocole d'ouverture de port.
BOOL CloseCOM   (); // protocole de fermeture
BOOL ReadCOM    (void* buffer, int nBytesToRead, int* pBytesRead); //protocole lecture
BOOL WriteCOM   (void* buffer, int nBytesToWrite, int* pBytesWritten); //protocole ecriture
HANDLE FPCom=NULL; // déclaration de la variable de stockage du port com (Fichier Port Com).

int main()

{
    char buffer[256];
    printf ("Port com a ouvrir :\n\n") ;
    scanf("%d",&NCom) ;
    OpenCOM(NCom);
    if(!OpenCOM(NCom)) return -1;
    printf("\nPort Com%d ouvert.\n",&NCom);

     do
    {
        /* menu */
        printf("\r\n");
        printf("1 : Donnée en OutPut.\n");
        printf("2 : Donnees en Input.\n");
        printf("3 : Quitter.\n");
        scanf("%d", &nChoix);

        if(nChoix == 1) //OutPut
        {
            printf("\n");
            printf("Donnees a envoyer :\n");
            fflush(stdin); // fonction vider le buffer (memoire tampon) dans stdin.h
            gets(buffer); // gets() contrairement a scanf n'est pas formate.
            printf("\n");
            printf("Envoi des donnees...\n");
            if(WriteCOM(buffer, strlen(buffer), &nBytesWritten))
            {
                 printf("%d octet(s) envoye(s).\n", nBytesWritten);
            }
            else
            {
                printf("Erreur lors de l'envoi.\n");
            }
        }
        if(nChoix == 2) //InPut
        {
            printf("\n");
            printf("Reception de donnees...\n");
            if(ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead))
            {
                buffer[nBytesRead] = '\0';
                printf("%d octet(s) recu(s) :\n%s\n", nBytesRead, buffer);
            }
            else
                printf("Erreur lors de la réception.\r\n");
        }
    }while(nChoix != 3);

    CloseCOM(); // on ferme pour quitter proprement
    return 0;
}

BOOL OpenCOM(int NCom)
{
    char ComN [16];
    sprintf(ComN, "COM%d", NCom);

    FPCom = CreateFile(ComN, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                        OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);

        if(FPCom ==INVALID_FILE_ATTRIBUTES)
        {
                if(GetLastError()==ERROR_FILE_NOT_FOUND)
                {
                    printf ("\nERREUR : Port introuvable\n");
                }
            printf ("\nERREUR : erreur lors de la connection.\n") ;
        }

         /*initialisations des parametre de communication (cmd API)*/
        SetupComm(FPCom, RX_SIZE, TX_SIZE) ;

        if(!SetCommTimeouts(FPCom, &DelAtt) || !SetCommState(FPCom, &PCConf))
            {
                printf("Erreur lors de la configuration du port COM%d", NCom);
                CloseHandle(FPCom);
                return FALSE;
            }

    /* on vide les tampons d'émission et de réception, mise à 1 DTR (cmd API) */
    PurgeComm(FPCom, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    EscapeCommFunction(FPCom, SETDTR);
    return TRUE;
}


BOOL CloseCOM()
{
    CloseHandle(FPCom);
    return TRUE;
}

BOOL ReadCOM(void* buffer, int nBytesToRead, int* pBytesRead)
{
    return ReadFile(FPCom, buffer, nBytesToRead, pBytesRead, NULL);
}


BOOL WriteCOM(void* buffer, int nBytesToWrite, int* pBytesWritten)
{
    return WriteFile(FPCom, buffer, nBytesToWrite, pBytesWritten, NULL);
}

A voir également:

2 réponses

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
27 févr. 2012 à 15:38
Bonjour,
comme tu as des messages d'erreur au cours de l'ouverture du port COM, il serait bien de les fournir afin de cerner la fonction en cause lors de l'ouverture.
as-tu essayé de remplacer FILE_ATTRIBUTE_SYSTEM par 0?



louis
3
StormEnnairo Messages postés 4 Date d'inscription vendredi 24 février 2012 Statut Membre Dernière intervention 27 février 2012
27 févr. 2012 à 18:42
hum... en fait javais mis un lien qui semble avoir ete mal fait, en fait je me ss apercue demon erreur par hasard : en efft j'ouvre le port deux foix, la premier explicitement ligne 6eme ligne aps le main, et ine seconde fois implicitement, la ligne juste aprs.
Mais merci beaucoup pour t'etre penche sur le problem.
Bonne soiree !
0
Rejoignez-nous