Est-ce que quelqu'un aurais une solution pour piloter le port parall�le, autre que DlPortIO qui chez moi ne fonctionne plus avec BDS 2006
Merci d'avance
Est-ce que quelqu'un aurais une solution pour piloter le port parall�le, autre que DlPortIO qui chez moi ne fonctionne plus avec BDS 2006
Merci d'avance
Salut kurul1
Peut etre en utilisant quelque chose comme ceci, je ne suis pas sur du code, je n'ai pas la possibiite de l'essayer
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 void __fastcall TForm1::Button1Click(TObject *Sender) { DCB dcb; HANDLE hComm; BYTE bSign = 0xFF; DWORD dwBytesRecive ; hComm = CreateFile( "LPT1", FILE_READ_DATA | FILE_WRITE_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hComm == INVALID_HANDLE_VALUE) { MessageBox(Form1->Handle,"Can't open file","Error",MB_OK+MB_ICONERROR); } if((GetCommState(hComm, &dcb))==0) { MessageBox(Form1->Handle,"GetCommState Error","Error",MB_OK+MB_ICONERROR); // CloseHandle(hComm); } //Set LPT1 conditions...... //..... else { WriteFile(hComm, &bSign, 1, &dwBytesRecive,NULL); } CloseHandle(hComm); }
ton code met le message d'erreur du GetCommState.
En cherchant, j'ai trouver la dll inpout32.dll pour piloter le port parall�le, mais j'ai des soucis.
Je dois synchroniser deux logiciels pr�sent sur deux PC.
sur le premier PC, j'ai un logiciel qui envois un front montant sur la broche D0 du port parall�le.
Je voudrais sur le deuxi�me PC, me mettre en attente du front montant sur D0, et de d�clancher un affichage lorsque l'on re�oit le front montant.
J'ai donc importer les fonctions de lecture �criture de la DLL comme ceci
J'utilise �galement une union pour pouvoir r�cup�rer les valeurs de chaque broche (ce que je faisait avec dlPortIO)
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 #include <conio.h> /* prototype (function typedef) for DLL function Inp32 et out32: */ typedef short _stdcall (*PtrIn)(short portaddr); typedef void _stdcall (*PtrOut)(short EndPorta, short valor); // Adresse du port unsigned short AdressePort = 0x378; // Instance de la librairie HINSTANCE hLib; // Fonction de lecture PtrIn Lecture; // Fonction d'écriture PtrOut Ecriture; // On charge la librairie hLib = LoadLibrary("inpout32.dll"); // Si le chargement s'est mal passé if(hLib == NULL) { ShowMessage("Erreur de chargement de la librairie !"); return false; } // On récupère la fonction de lecture Lecture = (PtrIn) GetProcAddress(hLib, "Inp32"); // Si le chargement s'est mal passé if(Lecture == NULL) { ShowMessage("Erreur de chargement de la fonction inp32 !"); return false; } // On récupère la fonction d'écriture Ecriture = (PtrOut) GetProcAddress(hLib, "Out32"); // Si le chargement s'est mal passé if(Ecriture == NULL) { ShowMessage("Erreur de chargement de la fonction out32 !"); return false; }
Et donc pour lire les donn�es du Port, je fais ceci
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 // Union pour la récupération des broches de données union TBrochesDonnees { char chr; struct { unsigned char D0 : 1; unsigned char D1 : 1; unsigned char D2 : 1; unsigned char D3 : 1; unsigned char D4 : 1; unsigned char D5 : 1; unsigned char D6 : 1; unsigned char D7 : 1; }; };
Bien sur, j'ai une boucle pour l'attente du front montant, mais je ne l'ai pas d�taill� ici
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 // Union pour récupérer les données TBrochesDonnees Donnees; // On récupère les données Donnees.chr = (Lecture)(AdressePort);
Mon souci, c'est que les valeurs des broches restent toujours � 0 dans mon programme, il n'y a pas de changement d'�tat sur le 2�me PC.
J'ai tester si le voltage sur les broches changeait et c'est le cas.
J'ai donc fait un deuxi�me test en ex�cutant les 2 logiciels sur le m�me PC, et l�, le changement d'�tat se produit.
De quoi cela peut-il venir
Merci d'avance pour votre aide
Question b�te mais est ce que tes deux machines tournent sous le m�me syst�me d'exploitation? �a peut �tre une source de probl�me.
Es tu oblig� d'utiliser lpt1 car cette synchronisation peut aussi se faire via le r�seau Ethernet ou plus simplement avec une liaison s�rie par l'envoi d'un message. A moins que tu n'aies des contraintes temps r�el.
Oui, mes deux machines tournent sur windows XP.
J'ai effectivement des contraintes qui m'oblige a utiliser le port parall�le, car c'est un logiciel qui envois un front montant sur le port parall�le que je n'ai pas d�velopp�. Moi je suis charg� uniquement de r�ceptionner les donn�es sur le port et de d�tecter un front montant.
Le logiciel qui envoit le front montant est un logiciel qui pilote une plateforme de force. Et je doit synchroniser cela avec mon soft pour que d�s que l'on d�clenche une acquisition sur la plateforme, j'ai un affichage qui se r�alise.
J'ai d�j� r�alis� cette synchronisation avec le composant DlPortIO qui �tait tr�s pratique mais qui malheureusement ne fonctionne plus avec BDS2006, d'o� ma recherche d'une autre solution
As tu v�rifi� en bout de ligne que le voltage est bon. J'ai d�j� fait ce genre de manip il y a tr�s longtemps (avec une machine sous dos) et au bout de quelques m�tres de ligne le signal TTL n'�tait plus bon. Du coup pour r�soudre le probl�me j'ai mis un dispositif entre les deux pour regonfler mon signal.
Sinon il existe des cartes chez national instrument par exemple qui sont capable de g�rer ton probl�me. Maintenant c'est peut �tre pas possible pour des raisons de budget.
As tu essay� d'inverser les r�les de tes PC?
As tu v�rifi� le branchement de ton cable entre les deux PC?
Es ce toi qui a r�alis� le cable de liaison?
As tu une masse commune aux deux PC?
Tu as peut �tre d�j� regard� toutes ces questions mais c'est des �l�ments � v�rifier avant de se dire qu'il y a un probl�me au niveau du code. J'en sais quelque chose.
Oui je l'ai v�rifi� et le changement d'�tat � bien lieu.
Oui et le r�sultat est le m�me.
Oui plusieurs fois
C'est mon coll�gue �lectronicien qui � r�alis� le cable et c'est avec lui que j'ai fait les test pour les voltages.
Non puisque nous utilisons deux PC portable.
On as m�me essayer avec un PC classique et le r�sultat est le m�me.
Si tu veux, avant que je passe sour BDS2006, tout fonctionnait parfaitement avec le composant DLPortIO, mais maintenant plus rien.
Ca me g�ne donc fortement car j'ai a d�velopper plusieurs logiciels utilisant ce type de synchronisation.
Ce qui me surprend le plus c'est quand tu fais tourner tes deux programme sur la m�me machine �a marche?
A priori �a veut dire que les registres sont bien lu.
Peux tu essayer avec une alim de mettre un front montant sur la broche que tu teste et voir si tu lis quelque chose?
Encore une question tu envois un signal de type impulsion ou ton signal reste � un.Dans le premier cas il se peut que l'impulsion soit trop courte.
Sinon essaye de r�cup�rer ton ancien composant (DLPortIO) et int�gre le dans la biblioth�que de composants. Essaye aussi de voir si tu peut r�cup�rer le source de DLPortIO et recompile le sous Xp. J'ai eu un cas comme �a avec une DLL qui fonctionnait tr�s bien sous 2000 et qui ne fonctionnait plus sous Xp pour d'obsures raison de s�curit�s. Apr�s recompilation de la dll l'application a fonctionner sous xp et sous 2000 (avec la dll recompil�e)
Regarde aussi dans les forums windows (je pense au SDK) Il est possible qu'il y ai une dll ou une instruction qui convienne.
Vas voir http://www.aurel32.net/elec/port_parallele.php Il y a pas mal d'info
Ce n'est pas une impulsion que le logiciel envois.
Il passe D0 � 1 au d�but de l'acquisition et repasse � 0 quand l'acquisition est termin�e.
Pour DLPortIo, le probl�me n'est pas de l'ajouter dans la biblioth�que de composant, il s'ajoute, mais c'est � la compilation de mon soft que j'ai une erreur externe
Il cherche un chemin qui n'existe pas puisque c'est le chemin pour Builder 6 et je ne sais pas ou il faut changer ca. J'ai parcourut toutes les options du projet permettant d'ajouter le composant, sans r�sultats.
Code : S�lectionner tout - Visualiser dans une fen�tre � part [Lieur Erreur] Error: Externe '__fastcall Classes::RegisterComponents(const System::AnsiString, System::TMetaClass * const *, const int)' non résolu référencé par C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DLPRINTER.LIB|C:\prg\CBuilder6\CBuilder6\DlIoPOrt\DLPrinterPortIO.cpp
Je n'ai pas l'habitude de cette erreur sous CBuilder mais pose la question sur un autre post. Effectivement je suis persuad� qu'il s'agit d'un chemin qui n'est pas trouv� par l'�diteur de lien ou bien il manque un fichier quelque part.
Combien de temps dure une acquisition?
c'est d�j� fait, j'en ai un post de 3 pages et pas de solution.
ici
Du coup j'ai cr�� un autre post pour trouver une solution autre et voil� ou j'en suis.
Sinon la dur�e d'une acquisition peut �tre variable, c'est selon les besoins, mais jamais moins de 5 secondes ca c'est sur
5 secondes c'est long donc ce n'est pas un probl�me li� � une dur�e d'impulsion trop courte.
Non justement, j'y avais pensez mais c'est pas le cas, puisque le logiciel reste � l'�tat 1 tout le long d'une acquisition et redescend � 0 la fin de l'acquisition.
Et 5 secondes c'est le minimum possible, en r�gle g�n�rale, les acquisitions dure entre 20 et 40 secondes pour les applications que l'on en fait.
Je trouve aucune solution pour r�soudre ca et ca commence � m'inqui�t�, car on a absolument besoin de cette synchronisation pour que les donn�es qu'on r�coltes soit correcte.
Salut
une idee comme cela est ce que ton port est bien configure en entree, le port parallele etant bidirectionnel, c'est peut etre la que se situe ton probleme
J'ai regarder cela aussi.
Quand j'utilisais DLPortIo il fallait mettre le bit 5 du registre de control � 1, c'est � dire le bit 5 du registre de base + 2, soit la broche IO
j'ai donc essay� avec la DLL en faisant ceci.
Je me suis fait une classe pour le Port parall�le
PortParallele.h
PortParallele.cpp
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 #include <vcl.h> #include <conio.h> /* prototype (function typedef) for DLL function Inp32 et out32: */ typedef short _stdcall (*PtrIn)(short portaddr); typedef void _stdcall (*PtrOut)(short EndPorta, short valor); // Union pour la récupération des broches de données union TBrochesDonnees { char chr; struct { unsigned char D0 : 1; unsigned char D1 : 1; unsigned char D2 : 1; unsigned char D3 : 1; unsigned char D4 : 1; unsigned char D5 : 1; unsigned char D6 : 1; unsigned char D7 : 1; }; }; // Union pour la récupération des broches d'état union TBrochesEtats { char chr; struct { unsigned char B0 : 1; unsigned char B1 : 1; unsigned char B2 : 1; unsigned char ERREUR : 1; unsigned char SELECT : 1; unsigned char PE : 1; unsigned char ACK : 1; unsigned char BUSY : 1; }; }; // Union pour la récupération des broches de controles union TBrochesControles { char chr; struct { unsigned char STROBE : 1; unsigned char AUTOFEED : 1; unsigned char INIT : 1; unsigned char SELECT_IN : 1; unsigned char AI : 1; unsigned char IO : 1; unsigned char Bit6 : 1; unsigned char Bit7 : 1; }; }; // Classe pour le port parallèle class TPortParallele { private : // Adresse du port unsigned short AdressePort; // Instance de la librairie HINSTANCE hLib; // Fonction de lecture PtrIn Lecture; // Fonction d'écriture PtrOut Ecriture; // Booléen pour marquer que le port est en lecture bool EnLecture; public : // Constructeur __fastcall TPortParallele(); // Destructeur __fastcall ~TPortParallele(); // Méthode chargée de l'initialisation bool __fastcall Initialisation(unsigned short Adresse); // Méthode chargée de mettre le Port à 0 void __fastcall MiseAZero(void); // Méthode chargée de mettre le port en lecture void __fastcall MiseEnLecture(void); // Méthode chargée de mettre le port en écriture void __fastcall MiseEnEcriture(void); // Lecture des données TBrochesDonnees __fastcall LireDonnees(void); // Lecture des Etats TBrochesEtats __fastcall LireEtats(void); // Lecture des controles TBrochesControles __fastcall LireControles(void); // Méthode chargée d'afficher l'état des controles void __fastcall AfficherControles(TBrochesControles Controles); };
Et donc voil� ce que je fait lorsque je veux lire sur le port
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 #include "PortParallele.h" //--------------------------------------------------------------------------- // Constructeur __fastcall TPortParallele::TPortParallele() { // On marque que le port n'est pas en lecture EnLecture = false; } //--------------------------------------------------------------------------- // Destructeur __fastcall TPortParallele::~TPortParallele() { // On libère la librairie FreeLibrary(hLib); } //--------------------------------------------------------------------------- // Méthode chargée de l'initialisation bool __fastcall TPortParallele::Initialisation(unsigned short Adresse) { // Booléen pour la valeur de retour bool Retour; // On affecte l'adresse du port AdressePort = Adresse; // On charge la librairie hLib = LoadLibrary("inpout32.dll"); // Si le chargement s'est mal passé if(hLib == NULL) { ShowMessage("Erreur de chargement de la librairie !"); return false; } // On récupère la fonction de lecture Lecture = (PtrIn) GetProcAddress(hLib, "Inp32"); // Si le chargement s'est mal passé if(Lecture == NULL) { ShowMessage("Erreur de chargement de la fonction inp32 !"); return false; } // On récupère la fonction d'écriture Ecriture = (PtrOut) GetProcAddress(hLib, "Out32"); // Si le chargement s'est mal passé if(Ecriture == NULL) { ShowMessage("Erreur de chargement de la fonction out32 !"); return false; } // SI l'on est ici, c'est que les chargements se sont bien passé // On met le port à 0 MiseAZero(); // On retourne true pour marquer que l'initialisation s'est bien passé return true; } //--------------------------------------------------------------------------- // Méthode chargée de mettre le Port à 0 void __fastcall TPortParallele::MiseAZero(void) { // Si le port n'est pas déjà en écriture if(EnLecture) { // On se met en écriture MiseEnEcriture(); } // On met les broches de données à 0 (Ecriture)(AdressePort + 2, 0x00); } //--------------------------------------------------------------------------- // Méthode chargée de mettre le port en lecture void __fastcall TPortParallele::MiseEnLecture(void) { // On lit les broches de controles TBrochesControles Controles = LireControles(); // On met la broche IO à 1 Controles.IO = 1; // On écrit la nouvelle valeur des ports (Ecriture)(AdressePort + 2, Controles.chr); // On le met en lecture EnLecture = true; } //--------------------------------------------------------------------------- // Méthode chargée de mettre le port en écriture void __fastcall TPortParallele::MiseEnEcriture(void) { // On lit les broches de controles TBrochesControles Controles = LireControles(); // On met la broche IO des controles à 0 (Ecriture)(AdressePort + 2, Controles.chr & 0xDF); // On le met en écriture EnLecture = false; } //--------------------------------------------------------------------------- // Lecture des données TBrochesDonnees __fastcall TPortParallele::LireDonnees(void) { // Union pour récupérer les données TBrochesDonnees Donnees; // Si le port n'est pas déjà en lecture if(!EnLecture) { // On se met en lecture MiseEnLecture(); } // On récupère les données Donnees.chr = (Lecture)(AdressePort); // On les retournes return Donnees; } //--------------------------------------------------------------------------- // Lecture des Etats TBrochesEtats __fastcall TPortParallele::LireEtats(void) { // Union pour récupérer les données TBrochesEtats Etats; // On récupère les Etats Etats.chr = (Lecture)(AdressePort + 1); // On les retournes return Etats; } //--------------------------------------------------------------------------- // Lecture des controles TBrochesControles __fastcall TPortParallele::LireControles(void) { // Union pour récupérer les données TBrochesControles Controles; // On récupère les controles Controles.chr = (Lecture)(AdressePort + 2); // On les retournes return Controles; } //---------------------------------------------------------------------------
j'ai fait un programme avec des Edit qui affiche les valeurs de chaque broche
Et l�, ca fait n'importe quoi. J'ai une valeur globale pour les donn�es qui vaut -1.
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 #include "PortParallele.h" ...... // OBjet pour piloter le port Parallele TPortParallele *Port; // Objet pour récupérer les données TBrochesDonnees Donnees; // OBject pour récupérer les Etats TBrochesEtats Etats; // OBject pour récupérer les controles TBrochesControles Controles; // Booléen pour savoir si l'on est en lecture ou non bool Lecture; // On ouvre le port Port = new TPortParallele(); // Si l'initialisation s'est bien passé if(Port->Initialisation(0x378)) { // On marque que l'on est en lecture Lecture = true; // Tant que l'on est en lecture while(Lecture) { // On lit les données sur le port parallèle Donnees = Port->LireDonnees(); // On renseigne les Edit EditValeurDonnees->Text = AnsiString(int(Donnees.chr)); EditD0->Text = AnsiString(Donnees.D0); EditD1->Text = AnsiString(Donnees.D1); EditD2->Text = AnsiString(Donnees.D2); EditD3->Text = AnsiString(Donnees.D3); EditD4->Text = AnsiString(Donnees.D4); EditD5->Text = AnsiString(Donnees.D5); EditD6->Text = AnsiString(Donnees.D6); EditD7->Text = AnsiString(Donnees.D7); // On lit les états sur le Port Etats = Port->LireEtats(); // On renseigne les Edit EditValeurEtats->Text = AnsiString(int(Etats.chr)); EditError->Text = AnsiString(Etats.ERREUR); EditSelect->Text = AnsiString(Etats.SELECT); EditPe->Text = AnsiString(Etats.PE); EditAck->Text = AnsiString(Etats.ACK); EditBusy->Text = AnsiString(Etats.BUSY); // On lit les controles sur le port Controles = Port->LireControles(); // On renseigne les Edit EditValeurControles->Text = AnsiString(int(Controles.chr)); EditStrobe->Text = AnsiString(Controles.STROBE); EditAutoFeed->Text = AnsiString(Controles.AUTOFEED); EditInit->Text = AnsiString(Controles.INIT); EditSelectIn->Text = AnsiString(Controles.SELECT_IN); EditAI->Text = AnsiString(Controles.AI); EditIO->Text = AnsiString(Controles.IO); Application->ProcessMessages(); } }
Si je ne fait pas la mise en lecture, tout reste � 0
Je me suis un peu balad� sur internet et j'ai trouv� un DLPortIO. J'ai t�l�charg� et il y avait 2 applications une en C et une en visual basic. Je te sugg�re d�j� de voir en mettant la pin D0 � 1 (avec un g�n� de tension par exemple) et toutes les autres � z�ro (en les reliant � la pin GND) de voir si avec ces applications tu lis bien le bon r�sultat.
Maintenant j'ai essay� d'utiliser cette dll avec CBuilder et j'ai une erreur au niveau de l'�dition de lien. Et quand je regarde les .h de la dll c'est du visual studio tout crach� ce qui peut poser probl�me avec le CBuilder.
Il y a une manip possible (mais lourdingue) qui consiste � �crire une DLL avec visual studio (il y a une version express gratuite t�l�chargeable chez microsoft) qui soit compatible avec CBuilder. C'est tr�s chiant mais �a m'a sauv� la vie une fois.
Pour visual C++ ce n'est pas un souci, on l'a �galement.
D�sol�, j'ai modifi� mon post pr�c�dent pendant que tu postais, j'ai mis tout le code que j'utilise actuellement pour que tu puisse voir ce que je fait.
Pour DlPortIO, il y a une version pour C++Builder que j'ai, tu peux d'ailleurs trouver un tuto sur DVP pour l'utiliser, mais cela me produit depuis que je suis passez � BDS2006 l'erreur que je t'ai expos� plus haut
J'ai pens� � quelque chose d'autre. Est ce qu'il y a une imprimante affect� au port parall�le. Si c'est le cas le syst�me peut bloquer l'acc�s.
non aucune imprimante n'est affecter car toutes nos imprimantes sont en r�seau
De plus pour les portables, ils ne sont connecter ni � internet ni � une imprimante.
Partager