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
Partager