port com
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

port com



  1. #1
    coeur noire
    Invité

    port com


    ------

    salut
    je voudrais savoir si sur XP avec codeBlocke ce code me permet d'envoyer un octet sur le port com?
    et pourquoi quand je compile le bloc note ouvre le fichier texte ?



    Code:
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    /*=============================================================================
    Définition de constantes
    =============================================================================*/
    int main(void)
    {
        system("mode com1:9600,n,8,1");
        FILE *fichier=NULL;
        fichier=fopen("texe.txt","w+");
        if (fichier==NULL)
        {
            printf("erreur");
            return 0;
        }
        else
        fprintf(fichier,"00000");
        fclose (fichier);
        system("texe.txt");
    
        return 0;
    }

    -----

  2. #2
    Dlzlogic

    Re : port com

    Bonjour,
    Pour la première question, il y a tellement longtemps que je n'ai pas utilisé les com que je ne voudrais pas dire de bêtise.
    Pour ls seconde question, je suppose que c'est la commande system("txte.txt"); qui ouvre block-note. Que comptez-vous faire réellement avec cette commande?

  3. #3
    coeur noire
    Invité

    Re : port com

    salut


    avec l'hyperterminal windows XP+ pic 16F88 +max232 +diode résistance sur portA1 j'éclaire une diode un truc tout simple
    maintenant je veux éclairer cette diode avec un programme en C
    j'ai terminer le programme en C avec des images un menu une diode qui s'allume et qui s'éteint avec la SDL
    le problème c'est que le code ne fonctionne pas du premier coup avant je dois refaire le teste avec l'hyperterminal après je ferme l'hyperterminal et le code fonctionne avec le programme

  4. #4
    Jack
    Modérateur

    Re : port com

    Le port COM ne peut pas être partagé entre ton application et hyperterminal. C'est soi l'un ou soit l'autre.

    A+

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : port com

    Je pense que le port est au départ en contrôle de flux hard et que ton programme n'a pas positionné les paramètre du port com.

    Comme le périph (ou son absence ici) dit "pas prêt", l'os obéi et n'envoie rien.
    Après avoir "correctement" ouvert ET configuré le port avec hyperterminable, ensuite, ça roule.

    Ensuite, faire un prog C pour lancer des commandes, c'est pas le plus élégant...
    Soit tu contrôles tout en C, soit tu fais un script.
    Jusqu'ici tout va bien...

  7. #6
    coeur noire
    Invité

    Re : port com

    je lance et je ferme l'hyperterminal puis je compile le programme C codeblock XP
    je demande une petite correction si vous avez le temps l'envie


    main.c
    Code:
    #include <stdio.h>
    #include <cstdlib>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include "fonction.c"
    #include <windows.h>
    #include <winbase.h>
    #include <conio.h>
    #include <string.h>
    
    // CONSTANTES
    //-------------------------------------------------------------------------------
    // Définition du code d'erreurs
    typedef enum
    {
        e_ErrCom_None, // Pas d'erreur
        e_ErrCom_Creation, // Erreur lors de la création du flux e_ErrCom_Utilise, // Le port com est déjà utilisé
        e_ErrCom_Inexistant, // Le port com n'existe pas
        e_ErrCom_Timeout, // Timeout lors d'une émission-réception
        e_ErrCom_Emission, // Erreur lors de l'émission
        e_ErrCom_Reception, // Erreur lors de la réception
        e_ErrCom_Definition_Trame, // Erreur de définition de la trame
        e_ErrCom_Nack, // Demande non prise en coompte
        e_ErrCom_Checksum // Erreur de checksum
    } e_ErrCom;
    
    // Nom du port série
    #define PORT1 "COM1"
    #define PORT2 "COM2"
    
    // Définition des vitesses de communication
    #define V1200 1200
    #define V2400 2400
    #define V4800 4800
    #define V9600 9600
    
    // Définition du nombre de bits
    #define BITS_7 7
    #define BITS_8 8
    
    // Définition du nombre de bits de stop
    #define BIT_DE_STOP_1 1
    #define BIT_DE_STOP_2 2
    
    // Définition de la parité
    #define PAS_DE_PARITE 'N'
    #define PARITE_IMPAIRE 'O'
    #define PARITE_PAIRE 'E'
    
    // Codes de retour génériques
    #define OK 1
    #define KO 0
    
    // Longueur max réservée pour une trame
    #define LG_TRAME 100
    
    // PROTOTYPES
    //----------------------------------------------------------------------------
    e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits);
    e_ErrCom EmissionCom(const void *lpBuf, unsigned int nCount);
    e_ErrCom ReceptionCom(void *lpBuf, unsigned int nCountMax, unsigned int *pCountRead);
    void FermeCom();
    
    // VARIABLES GLOBALES
    //-----------------------------------------------------------------------------
    DCB g_DCB; // structure dcb du port
    e_ErrCom g_ErrCom= e_ErrCom_None; // Variable des erreurs de com
    HANDLE g_hCom = 0; // handle de la com
    
    int main (int argc,char *argv[])
    {
    
        int nId=1, nChoice, nBytesWritten, nBytesRead;
        SDL_Init(SDL_INIT_VIDEO);
        input in;
        SDL_Surface *ecran=NULL,*menu=NULL;
        ecran=SDL_SetVideoMode(500,600,32,SDL_HWSURFACE);
        menu=SDL_LoadBMP("menu.bmp");
        SDL_Rect position;
        position.x=0;
        position.y=0;
        memset(&in,0,sizeof(in));
        char buffer1='B';
        char buffer2='A';
        while (!in.key[SDLK_ESCAPE]&&!in.quit)
        {
            traitementInfo(&in);
            if (in.key[SDLK_1]==1)
            {
    
    
                in.key[SDLK_1]=0;/*quand j'apui 1 le portCom envoie la lettre B en binaire et on sort du menu pour que l'image de la diode éclairé apparais*/
                g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PAS_DE_PARITE,BIT_DE_STOP_1);
                g_ErrCom=EmissionCom(&buffer1,sizeof(buffer1));
                FermeCom();
                ledAllume(ecran);/*on sort du menu image de la diode Allumé*/
    
            }
    
            if (in.key[SDLK_0]==1)
            {
                in.key[SDLK_0]=0;
                g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PAS_DE_PARITE,BIT_DE_STOP_1);/*quand j'apui 0 le portCom envoie la lettre A en binaire et on sort du menu pour que l'image de la diode éteint  apparais*/
                g_ErrCom=EmissionCom("A",sizeof("A"));
                FermeCom();
    
                ledEteint(ecran);/*on sort du menu image de la diode éteint*/
    
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB((*ecran).format,255,255,255));
            SDL_BlitSurface(menu,NULL,ecran,&position);/*dans le menu */
            SDL_Flip(ecran);
        }
        SDL_FreeSurface(menu);
    
    
    }
    
    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=BaudRate;
            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;
    }
    
    
    
    //----------------------------------------------------------------------------
    // FONCTION : EmissionCom
    //----------------------------------------------------------------------------
    // DESCRIPTION :
    // Emission d'octets sur la liaison série
    //
    //----------------------------------------------------------------------------
    // PARAMETRES :
    // -lpBuf Pointeur sur les octets a emettre
    // -nCount Nombre d'octet a emettre
    //
    //----------------------------------------------------------------------------
    // RETOUR :Code d'erreur#
    //----------------------------------------------------------------------------
    e_ErrCom EmissionCom(const void* lpBuf,unsigned int nCount)
    {
    
        DWORD NumBytes=0;
    
        if (g_hCom!=NULL)
        {
    // On pari sur pas d'erreur
            g_ErrCom=e_ErrCom_None;
    
    //Emission du buffer#
            if (WriteFile(g_hCom,lpBuf,nCount,&NumBytes,NULL)==0)
            {
                g_ErrCom=e_ErrCom_Emission;
            }
        }
        else
    //Le port n'a pas été ouvert
            g_ErrCom=e_ErrCom_Creation;
    
        return g_ErrCom;
    
    }
    
    //---------------------------------------------------------------------------
    // FONCTION : ReceptionCom
    //---------------------------------------------------------------------------
    // DESCRIPTION :
    // Reception de caractères sur la liaison série
    //
    //---------------------------------------------------------------------------
    // PARAMETRES :
    // -lpBuf Pointeur sur le buffer de caractère a lire
    // -nCountMax Nombre maxi de caractère a lire
    // -pCountRead Pointeur sur le nombre de caractères lus
    //---------------------------------------------------------------------------
    // RETOUR :Code d'erreur
    //---------------------------------------------------------------------------
    e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead)
    {
        COMSTAT Stat;
        DWORD Errors;
        unsigned int nCarALire;
        unsigned long NCarLus=0;
    
        if (g_hCom!=NULL)
        {
    //on pari sur pas d'erreur
            g_ErrCom=e_ErrCom_None;
    
    //Pour éviter de gérer un time out
            Sleep(500);
    
    //Pour connaitre le nombre d'octets dans le buffer d'entrée
            ClearCommError(g_hCom,&Errors,&Stat);
            nCarALire=Stat.cbInQue;
    
    //On effectue la lecture si il y a des caractères présents
            if ( (nCarALire>0)&&(nCarALire<=nCountMax) )
            {
                if (ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0)
                {
                    g_ErrCom=e_ErrCom_Reception;
                }
    
            }
            *pCountRead=NCarLus;
        }
        else
    
            //Le port n a pas été ouvert
            g_ErrCom=e_ErrCom_Creation;
    //Compte rendu de l'exécution
        return g_ErrCom;
    }
    void FermeCom()
    {
        if (g_hCom!=NULL)
        {
            CloseHandle(g_hCom);
        }
    }
    fonction.h
    Code:
    #ifndef FONCTION_H_INCLUDED
    #define FONCTION_H_INCLUDED
    
    #define BOOL int
    
    typedef struct input
    {
        char key[SDLK_LAST];
        char button[6];
        int quit;
        int mouseX,mouseY;
    
    };
    void traitementInfo(input *in);/*gestion de la souris du clavier*/
    void ledAllume(SDL_Surface *ecran);/*image de la diode*/
    void ledEteint(SDL_Surface *ecran);/*imae de la diode*/
    
    
    
    #endif // FONCTION_H_INCLUDED

    Code:
    #include <stdio.h>
    #include <cstdlib>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include "fonction.h"
    fonction.c
    void traitementInfo(input *in)
    {
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_KEYDOWN:
                (*in).key[event.key.keysym.sym]=1;
                break;
            case SDL_KEYUP:
                (*in).key[event.key.keysym.sym]=0;
                break;
            case SDL_MOUSEMOTION:
                (*in).mouseX=event.motion.x;
                (*in).mouseY=event.motion.y;
                break;
            case SDL_MOUSEBUTTONDOWN:
                (*in).button[event.button.button]=1;
                (*in).mouseX=event.button.x;
                (*in).mouseY=event.button.y;
                break;
            case SDL_QUIT:
                (*in).quit=1;
                break;
            }
    
    
        }
    }
    
    void ledAllume(SDL_Surface *ecran)
    {
        SDL_Surface *ampoule=NULL;
        SDL_Rect positionAmpoule;
        ampoule=SDL_LoadBMP("image2.bmp");
        input in;
        positionAmpoule.x=250;
        positionAmpoule.y=250;
        memset(&in,0,sizeof(in));
        while (!in.key[SDLK_ESCAPE]&&!in.quit)
        {
            traitementInfo(&in);
            SDL_FillRect(ecran,NULL,SDL_MapRGB((*ecran).format,200,255,255));
            SDL_BlitSurface(ampoule,NULL,ecran,&positionAmpoule);
            SDL_Flip(ecran);
    
        }
        SDL_FreeSurface(ampoule);
    
    }
    void ledEteint(SDL_Surface *ecran)
    {
        SDL_Surface *ampoule=NULL;
        SDL_Rect positionAmpoule;
        ampoule=SDL_LoadBMP("image1.bmp");
        input in;
        positionAmpoule.x=250;
        positionAmpoule.y=250;
        memset(&in,0,sizeof(in));
        while (!in.key[SDLK_ESCAPE]&&!in.quit)
        {
    
            traitementInfo(&in);
            SDL_FillRect(ecran,NULL,SDL_MapRGB((*ecran).format,200,255,255));
            SDL_BlitSurface(ampoule,NULL,ecran,&positionAmpoule);
            SDL_Flip(ecran);
    
        }
        SDL_FreeSurface(ampoule);
    
    
    
    }

  8. #7
    polo974

    Re : port com

    je demande une petite correction ...
    Faites passer le fouet...

    Je pense que tu as lu ça:
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    et l'exemple
    http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx
    mais attention, l'exemple n'est qu'un exemple (incomplet)...
    il faut bien voir TOUT le DCB.

    Ensuite, quand un truc ne marche pas, il faut tracer...

    Par exemple afficher le DCB du get... avant et après passage par hyperterminal (pour voir ce que tu as omis).

    Astuce: pour visualiser, mettre le texte dans un edit-box non editable plutôt que dans un static-box ou message-box pour pouvoir copier le texte... (je ne sais plus trop comment ça s'appelle ces trucs...)
    Jusqu'ici tout va bien...

  9. #8
    coeur noire
    Invité

    Re : port com

    salut


    après avoir mieux regarder le dcb,j'ai modifier g_DCB.Parity=Parity;
    par g_DCB.Parity=PAS_DE_PARITE;
    c'est plus cohérent
    le HANDLE le dcb ca fais partie de l' API Windows ?
    DCB g_DCB; g_DCB est une variable de type DCB qui une structure mais cette structure n'est déclaré nul part dans le code ?
    le code fonction sans utilisé l'hyperterminal
    merci a tous

  10. #9
    coeur noire
    Invité

    Re : port com

    salut


    après avoir mieux regarder le dcb,j'ai modifier g_DCB.Parity=Parity;
    par g_DCB.Parity=NOPARITY;
    g_DCB.StopBits=ONESTOPBIT;
    c'est plus cohérent
    le HANDLE le dcb ca fais partie de l' API Windows ?
    DCB g_DCB; g_DCB est une variable de type DCB qui une structure mais cette structure n'est déclaré nul part dans le code ?
    le code fonction sans utilisé l'hyperterminal
    merci a tous
    Dernière modification par JPL ; 25/07/2011 à 16h21. Motif: petit nettoyage pour rendre plus compréhensible

  11. #10
    Dlzlogic

    Re : port com

    Bonjour,
    Je n'ai trouvé nulle part de référence à une structure DCB.
    Où avez-vous trouvé cela?

  12. #11
    polo974

    Re : port com

    message 6 dans le code proposé.
    message 7 dans les liens sur la doc.
    Jusqu'ici tout va bien...

  13. #12
    coeur noire
    Invité

    Re : port com

    je viens de refaire le teste et je n'arrive plus a l'éteindre la diode
    dans le code la structure DCB n'est pas complet

Discussions similaires

  1. Relier un interrupteur sur port parallèle (ou port série)
    Par invitedc8ebe95 dans le forum Électronique
    Réponses: 11
    Dernier message: 04/02/2013, 09h20
  2. Port parallèle vers port série
    Par invite5d1bc976 dans le forum Électronique
    Réponses: 7
    Dernier message: 12/07/2012, 14h10
  3. tranformation port série en port usb
    Par invite708d9584 dans le forum Matériel - Hardware
    Réponses: 8
    Dernier message: 04/08/2008, 08h35
  4. [EN COURS] adaptateur port parallèle -> port jeu
    Par invite08492e69 dans le forum Électronique
    Réponses: 0
    Dernier message: 16/10/2006, 19h33
  5. Imprimante + port parallèle + port USB ?
    Par Myr dans le forum Matériel - Hardware
    Réponses: 9
    Dernier message: 14/01/2004, 19h05