IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

écrire sur le portCom1


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    Par défaut écrire sur le portCom1
    salut

    conf windows XP code Blocks win32 gui

    pouvez vous me dire si ce code me permet d'envoyer un octet dont la valeur correspond a la lettre B avec les bonnes valeurs vitesse 9600baud pas de parité 1 bit stop ?
    j'utilise portmon
    dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WriteFile (hPort, // Instance d'accès de votre port série
                   &Byte, //Pointeur sur la donnée à envoyer
                   sizeof(unsigned char),//Nombre de byte à envoyer
                   &dwNumBytesWritten,   
                   //byte écrit dans le buffer
                   NULL);
    le deuxièmes paramètre ne devrait il pas écrire Byte aux lieux de &Byte ?

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <windows.h>
    #include <string.h>
     
     
    int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
    {
     
        DWORD dwNumBytesWritten=0;
        char Byte = 'B';
        HANDLE hPort;
        LPSTR lpszPortName = TEXT("COM1");
        hPort = CreateFile (
                    lpszPortName,                  //port com1
                    GENERIC_READ | GENERIC_WRITE,  //accès en lecture ou en écriture
                    FILE_ATTRIBUTE_SYSTEM,                             //Share mode
                    NULL,                          //Pointer to the security attribute
                    OPEN_EXISTING,                 //Cela indique que l'instance sera créée
                    //à condition que le port de
                    //communication demandé existe
                    //et donc est connu de l'OS
                    0,                             //Port attributes
                    NULL);
        if (hPort == INVALID_HANDLE_VALUE)
        {
            MessageBox(NULL, TEXT("erreure"), TEXT("erreur createFile"), MB_OK);
     
        }
     
     
     
     
        PurgeComm(hPort,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
     
        DCB PortDCB;//structure DCB
        GetCommState (hPort,&PortDCB); // Structure de configuration
        PortDCB.DCBlength = sizeof (DCB);
        PortDCB.BaudRate = 9600;
        PortDCB.fBinary = TRUE;
        PortDCB.fParity = FALSE;
        PortDCB.fOutxCtsFlow = FALSE;
        PortDCB.fOutxDsrFlow = FALSE;
        PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
        PortDCB.fDsrSensitivity = FALSE;
        PortDCB.fTXContinueOnXoff = FALSE;
        PortDCB.fOutX = FALSE;
        PortDCB.fInX = FALSE;
        PortDCB.fErrorChar = FALSE;
        PortDCB.fNull = FALSE;
        PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
        PortDCB.fAbortOnError = FALSE;
        PortDCB.ByteSize = 8;
        PortDCB.Parity = NOPARITY;
        PortDCB.StopBits = ONESTOPBIT;
     
     
        if (!SetCommState (hPort, &PortDCB))
        {
            MessageBox(NULL, TEXT("erreur"), TEXT("erreur structure"), MB_OK);
            //Mettre ici votre code d'erreur
        }
     
        WriteFile (hPort, // Instance d'accès de votre port série
                   &Byte, //Pointeur sur la donnée à envoyer
                   sizeof(unsigned char),//Nombre de byte à envoyer
                   &dwNumBytesWritten,   //Pointer sur la variable contenant le nombre
                   //byte écrit dans le buffer
                   NULL);
     
     
     
     
     
        CloseHandle(hPort);
     
    }
    portmon
    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
    0	0.00004302	port com.exe	IRP_MJ_CREATE	Serial0	SUCCESS	Options: Open 	
    1	0.00000307	port com.exe	IOCTL_SERIAL_PURGE	Serial0	SUCCESS	Purge: TXABORT RXABORT TXCLEAR RXCLEAR	
    2	0.00000112	port com.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
    3	0.00000084	port com.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
    4	0.00000112	port com.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
    5	0.00000084	port com.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
    6	0.00000084	port com.exe	IOCTL_SERIAL_GET_BAUD_RATE	Serial0	SUCCESS		
    7	0.00000084	port com.exe	IOCTL_SERIAL_GET_LINE_CONTROL	Serial0	SUCCESS		
    8	0.00000084	port com.exe	IOCTL_SERIAL_GET_CHARS	Serial0	SUCCESS		
    9	0.00000084	port com.exe	IOCTL_SERIAL_GET_HANDFLOW	Serial0	SUCCESS		
    10	0.00000754	port com.exe	IOCTL_SERIAL_SET_BAUD_RATE	Serial0	SUCCESS	Rate: 9600	
    11	0.00000335	port com.exe	IOCTL_SERIAL_SET_RTS	Serial0	SUCCESS		
    12	0.00000363	port com.exe	IOCTL_SERIAL_SET_DTR	Serial0	SUCCESS		
    13	0.00000251	port com.exe	IOCTL_SERIAL_SET_LINE_CONTROL	Serial0	SUCCESS	StopBits: 1 Parity: NONE WordLength: 8	
    14	0.00000112	port com.exe	IOCTL_SERIAL_SET_CHAR	Serial0	SUCCESS	EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13	
    15	0.00000251	port com.exe	IOCTL_SERIAL_SET_HANDFLOW	Serial0	SUCCESS	Shake:1 Replace:40 XonLimit:2048 XoffLimit:512	
    16	0.00001481	port com.exe	IRP_MJ_WRITE	Serial0	SUCCESS	Length 1: B	
    17	0.00000168	port com.exe	IRP_MJ_CLEANUP	Serial0	SUCCESS		
    18	0.01199454	port com.exe	IRP_MJ_CLOSE	Serial0	SUCCESS

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fil de fer Voir le message
    salut

    conf windows XP code Blocks win32 gui

    pouvez vous me dire si ce code me permet d'envoyer un octet dont la valeur correspond a la lettre B avec les bonnes valeurs vitesse 9600baud pas de parité 1 bit stop ?
    j'utilise portmon
    dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WriteFile (hPort, // Instance d'accès de votre port série
                   &Byte, //Pointeur sur la donnée à envoyer
                   sizeof(unsigned char),//Nombre de byte à envoyer
                   &dwNumBytesWritten,   
                   //byte écrit dans le buffer
                   NULL);
    le deuxièmes paramètre ne devrait il pas écrire Byte aux lieux de &Byte ?
    Salut

    Non, c'est bien "&Byte". Ca veut dire que tu passes à cet endroit l'adresse d'une zone mémoire. Et la fonction ira chercher à cette adresse les "n" octets à envoyer, la valeur "n" étant passée en 3° paramètre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    Par défaut
    merci de m'avoir répondu

    le troisième paramètre de de la fonction WriteFile
    "sizeof(unsigned char)" est traduis par char=1 octet

    j'ai regarder des codes ou on passais la variable a sizeof peux ton écris cette fonction ex WriteFile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     (hPort, // Instance d'accès de votre port série
                   &Byte, //Pointeur sur la donnée à envoyer
                   sizeof(Bytes),//Nombre de byte à envoyer
                   &dwNumBytesWritten,   
                   //byte écrit dans le buffer
                   NULL);
    &Byte représente l'adresse ou la fonction récupère la valeur B en binaire ,on est d'accord



    sinon pouvez-vous mettre un code a partagé qui fonctionne avec l'api windows ?
    un code tout simple sans boite de dialogue avec la bonne configuration de la structure DCB PortDCB

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fil de fer Voir le message
    merci de m'avoir répondu

    le troisième paramètre de de la fonction WriteFile
    "sizeof(unsigned char)" est traduis par char=1 octet

    j'ai regarder des codes ou on passais la variable a sizeof peux ton écris cette fonction ex WriteFile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     (hPort, // Instance d'accès de votre port série
                   &Byte, //Pointeur sur la donnée à envoyer
                   sizeof(Bytes),//Nombre de byte à envoyer
                   &dwNumBytesWritten,   
                   //byte écrit dans le buffer
                   NULL);
    &Byte représente l'adresse ou la fonction récupère la valeur B en binaire ,on est d'accord
    Oui on est d'accord. Byte est une variable de type char contenant le caractère "B" et donc "&Byte" est bien l'adresse d'une zone mémoire. Et donc, en recevant "&Byte", la fonction WriteFile() pourra aller chercher et trouver et envoyer ce "B".

    Maintenant, en 3° parmètre tu passes "sizeof(Bytes)" Déjà il y a un "s" en trop car la variable est "Byte" et non "Bytes" (tu l'aurais appelée "carac" on aurait moins d'ambigüité).
    Donc tu passes sizeof(ta_variable). En l'état ça fonctionnera parce que ta variable est un élément direct (ici un char). Mais elle aurait été un pointeur, ça n'aurait pas marché parce qu'un pointeur est un élément indirect (le compilo ne sait pas d'avance si ton pointeur concerne 1 ou 100 octets)
    Un exemple avec un tableau
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char tab[10];
    char *pt=tab;
     
    printf("%d\n", sizeof(tab));    // => affichera très certainement 10
    printf("%d\n", sizeof(pt));    // => affichera très certainement 4 parce qu'une adresse ne fait que 4 octets
    printf("%d\n", sizeof(*pt));    // => affichera très certainement 1 parce que "*pt" n'est qu'un caractère

    Donc faut faire super gaffe avec sizeof()...

    Citation Envoyé par fil de fer Voir le message
    sinon pouvez-vous mettre un code a partagé qui fonctionne avec l'api windows ?
    un code tout simple sans boite de dialogue avec la bonne configuration de la structure DCB PortDCB
    Désolé, suis 100% Linux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 20
    Points
    20
    Par défaut
    salut


    faut que je passe a linux

Discussions similaires

  1. [DOM] [Débutant(e)] écrire sur un fichier XML à partir de java
    Par Samanta dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 05/02/2008, 11h13
  2. Comment écrire sur une image, dans un cadre ?
    Par Nutrino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/05/2005, 00h55
  3. lire/écrire sur un port com sans le monopoliser
    Par totofweb dans le forum Windows
    Réponses: 4
    Dernier message: 26/07/2004, 13h23
  4. [OS] Lire et écrire sur disquette
    Par trax44 dans le forum Programmation d'OS
    Réponses: 17
    Dernier message: 22/02/2004, 20h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo