Bonjour, j'aimerais savoir comment lire l'état de l'entrée CTS (ou l'entrée DSR) sur mon port série suivant si elle est haute ou basse ?
merci d'avance
Bonjour, j'aimerais savoir comment lire l'état de l'entrée CTS (ou l'entrée DSR) sur mon port série suivant si elle est haute ou basse ?
merci d'avance
Bonjour,
je n'ai pas souvent manipulé les ports série, mais des fois j'utilisais un composant TComPort qui est assez simple pour gérer le port série (surtout basculer le DTR ON/OFF). Je ne sais pas si ca pourrait t'aider.
Bon courage
Il existe bien sur un composant se nommant TCommport mais le projet que je suis actuellement en train d'effectuer ne doit pas passer par TCommport (création de mes propres classes RS232 etc ...). Donc pour cela, je cherche à le faire autrement. Je te remercie quand même de ta réponse![]()
Si quelqu'un a une petite idée ... de mon côté, je continue de chercher.
++
bonjour,
Je ne sais pas si cela pourra d’aider
Le code permet de déclencher un événement sur le changement d’état du CTS ou DSR
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
76
77
78
79
80
81 #include <windows.h> #include <assert.h> #include <stdio.h> void main( ) { HANDLE hCom; OVERLAPPED o; BOOL fSuccess; DWORD dwEvtMask; hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // default security attributes OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); if (hCom == INVALID_HANDLE_VALUE) { // Handle the error. printf("CreateFile failed with error %d.\n", GetLastError()); return; } // Set the event mask. fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR); if (!fSuccess) { // Handle the error. printf("SetCommMask failed with error %d.\n", GetLastError()); return; } // Create an event object for use by WaitCommEvent. o.hEvent = CreateEvent( NULL, // default security attributes FALSE, // auto reset event FALSE, // not signaled NULL // no name ); // Intialize the rest of the OVERLAPPED structure to zero. o.Internal = 0; o.InternalHigh = 0; o.Offset = 0; o.OffsetHigh = 0; assert(o.hEvent); if (WaitCommEvent(hCom, &dwEvtMask, &o)) { if (dwEvtMask & EV_DSR) { // To do. } if (dwEvtMask & EV_CTS) { // To do. } } else { DWORD dwRet = GetLastError(); if( ERROR_IO_PENDING == dwRet) { printf("I/O is pending...\n"); // To do. } else printf("WaitCommEvent failed with error %d.\n", GetLastError()); } }
cordialement
Bonjour,
merci pour le code mic.29 mais j'ai un petit probleme encore...
Je lance mon application et j'attend l'event sur CTS mais voilà !!! il y a beau avoir des events sur CTS mais je sors directement de la condition WaitCommEvent. Le dwEvtMask est tjrs à 0pourtant la sortie RTS est bien haute (+11volts) lorsque je lance mon programme et vu que j'ai fais un "pont" entre RTS et CTS je devrai "voir" l'event sur CTS...
Voilà où j'en suis ... je cherche ce qu'il ne va pas. Dis moi si tu as déjà essayer ton programme tel quel ??
merci d'avance pour ta réponse mic.29.
++
![]()
bonjour,
a mon avis dans le code posté précédemment il manque le settings du Comport
voir l'aide WIn32 pour les détails sur la structure DCB
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DCB PortSet; SetCommState(hCom,&PortSet);
cordialement
vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
je vous en souhaite une excellente lecture ...
A lire : Les règles du forum
Bon, le programme marche pour "voir" un événementmais le CTS ne sais pas exactement si l'évenement est une entrée haute (+12V) ou une entrée basse (-12V), car le truc que j'aimerais c'est :
lorsque je branche mon câble à ma carte de test, détecter que mon câble est bien en relation avec elle (état haut du CTS) ET AUSSI que le programme détecte lorsque je débranche le câble prématurément(état bas du CTS, avec ouverture d'une messagebox etc ..). Voilà je poste le code dans le cas où le CTS "voit" un évènement (mais distingue pas l'état bas je pense) dans la boucle
la boucle se fais tjrs par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 if (WaitCommEvent(hCom, &dwEvtMask, &o)) { if (dwEvtMask & EV_CTS) { Form1->Color=clLime; } else { Form1->Color=clRed; } }même si je débranche le câble
Code : Sélectionner tout - Visualiser dans une fenêtre à part Form1->Color=clLime
Bon, je cherche encore et je vous met le code que j'ai fait (il est simple).
Allez hopla , je mis remet de suite !!!!
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 HANDLE hCom; OVERLAPPED o; BOOL fSuccess; DWORD dwEvtMask; DCB dcb; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // default security attributes OPEN_EXISTING, NULL, NULL ); GetCommState(hCom, &dcb); SetCommState(hCom,&dcb); // Set the event mask. fSuccess = SetCommMask(hCom, EV_CTS); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (WaitCommEvent(hCom, &dwEvtMask, &o)) { if (EV_CTS) { Form1->Color=clLime; } else { Form1->Color=clRed; } } else { DWORD dwRet = GetLastError(); if( ERROR_IO_PENDING == dwRet) { printf("I/O is pending...\n"); // To do. } else printf("WaitCommEvent failed with error %d.\n", GetLastError()); } }
A++
bonjour,
tu vas avoir des problèmes avec ton code
la méthode WaitCommEvent est bloquante ce qui signifie que tu vas interreomptre la boucle de message windows dans ton applications et qu'elle va se bloquer si aucune activité n'est détectée sur le port
la méthode WaitCommEvent doit être utilisée dans un Thread séparé
d'autre part pour détecter un changement d'état dans les 2 sens tu dois
modifier la structure DCB (Voir aide Microsoft)
cordialement
vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
je vous en souhaite une excellente lecture ...
A lire : Les règles du forum
merci DjmSoftware de ta réponse déjà
je sais que WaitCommEvent est blocant mais ce programme c'est un test c'est tout, j'intégrerais par la suite ce bout de prog. dans un Thread dans mon code final
je vais regarder dans la structure dcb mais je n'ai point vu la fonction qui me permettrais de savoir l'état exact (0 ou 1) de l'entrée CTS (je suis peut être passer à coté tu me diras lol).
Bon je vais rechercher hopla .
A ++
Bonjour,
Bon, finalement j'ai utilisé la méthode avec TCommPort (vu le retard de mon projet). Mais j'aimerais bien savoir le codage sans TCommPort![]()
Voilà je met le "résolu" quand même ...
A++
Partager