Ελεγχως Παράλληλης Θύρας με C++

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
master3763
Δημοσιεύσεις: 65
Εγγραφή: 12 Δεκ 2008 16:10
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από master3763 » 12 Δεκ 2008 16:25

Καλησπέρα σε όλους ! Είναι πρώτη φωρα που γράφω στο forum .

Βρήκα την παρακάτο κατασκευή στο internet και το θέμα μου φάνηκε αρκετά ενδιαφέρον .

Είναι ένα κύκλωμα για τη χρησιμοποίηση θύρας εκτυπωτή ενός PC, για τον έλεγχο που χρησιμοποιεί το λογισμικό και κάποιο υλικό interface. Το κύκλωμα interface μαζί με το δεδομένο λογισμικό μπορεί να χρησιμοποιηθεί με την θύρα εκτυπωτών οποιουδήποτε PC για τον έλεγχο του εξοπλισμού (μέχρι οκτώ).
Το κύκλωμα interface που παρουσιάζεται στο σχήμα ειναι σχεδιασμένο για μόνο μια συσκευή, που ελέγχεται από D0 το κομμάτι στο pin 2 τhw 25pin παράλληλης θυρας. Ίδια κυκλώματα για τα υπόλοιπα κομμάτια στοιχείων D1 μέσω D7 (διαθέσιμα στις καρφίτσες 3 μέχρι 9) πρέπει να συνδεθούν παρόμοια. Η χρήση opto-coupler εξασφαλίζει πλήρη απομόνωση του PC από το κύκλωμας ηλεκτρονόμων. Για τον έλενχο του υλικόυ μπορούν να χρισιμοποπιθει το λογισμικό C/C++ αλλιος μπορεί να χρησιμοποιηθεί η λειτουργία outportb (portno, αξία) όπου το portno είναι η παράλληλη διεύθυνση θυρών (συνήθως 378hex για LPT1) και "value" είναι το στοιχείο που πρόκειται να σταλεί στην θύρα. Για value=0 όλα τα outputs (D0-D7) είναι off. Για value=1 D0 είναι on, value=2 D1 είναι on, value=4, D2 είνει on και κτλ π.χ.. Εάν value=29 (δεκαδικά) = 00011101 (δυαδικά) ->D0, D2, D3, D4 είναι on και το υπόλοιπο είναι off
Το κύκλωμα:

Εικόνα


ενα παράδιγμα κωδικα σε C/C++

Κώδικας: Επιλογή όλων

.
/*program to control devices using PC parallel port
The devices are controlled by pressing the keys 1-8
that corresponds to each of the 8 possible devices
*/

#include<dos.h>
#include<stdio.h>
#include<conio.h>
#define PORT 0x378 /* This is the parallel port address */

main&#40;&#41;
&#123;
char val=0,key=0;
char str1&#91;&#93;="ON ";
char str2&#91;&#93;="OFF";
char *str;
clrscr&#40;&#41;;
printf&#40;"Press the approriate number key to turn on/off devices&#58;\n\n"&#41;;
printf&#40;"Here Device1 is connected to D0 of parallel port and so on\n\n"&#41;;
printf&#40;"Press \"x\" to quit\n\n"&#41;;
gotoxy&#40;1,8&#41;;
printf&#40;"Device1&#58;OFF Device2&#58;OFF Device3&#58;OFF Device4&#58;OFF\n"&#41;;
printf&#40;"Device5&#58;OFF Device6&#58;OFF Device7&#58;OFF Device8&#58;OFF"&#41;;

while&#40;key!='x' && key!='X'&#41;
&#123;
gotoxy&#40;1,12&#41;;
printf&#40;"Value in hex sent to the port&#58;"&#41;;
key=getch&#40;&#41;;
switch&#40;key&#41;&#123;

case '1'&#58;

gotoxy&#40;9,8&#41;;
val=&#40;val&0x01&#41;?&#40;val&&#40;~0x01&#41;&#41;&#58;val|0x01;
str=&#40;val&0x01&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",val&#41;;
break;

case '2'&#58;

gotoxy&#40;21,8&#41;;
val=&#40;val&0x02&#41;?&#40;val&&#40;~0x02&#41;&#41;&#58;val|0x02;
str=&#40;val&0x02&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",val&#41;;
break;

case '3'&#58;

gotoxy&#40;33,8&#41;;
val=&#40;val&0x04&#41;?&#40;val&&#40;~0x04&#41;&#41;&#58;val|0x04;
str=&#40;val&0x04&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",val&#41;;
break;

case '4'&#58;

gotoxy&#40;45,8&#41;;
val=&#40;val&0x08&#41;?&#40;val&&#40;~0x08&#41;&#41;&#58;val|0x08;
str=&#40;val&0x08&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",val&#41;;
break;

case '5'&#58;

gotoxy&#40;9,9&#41;;
val=&#40;val&0x10&#41;?&#40;val&&#40;~0x10&#41;&#41;&#58;val|0x10;
str=&#40;val&0x10&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",val&#41;;
break;

case '6'&#58;

gotoxy&#40;21,9&#41;;
val=&#40;val&0x20&#41;?&#40;val&&#40;~0x20&#41;&#41;&#58;val|0x20;
str=&#40;val&0x20&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",val&#41;;
break;

case '7'&#58;

gotoxy&#40;33,9&#41;;
val=&#40;val&0x40&#41;?&#40;val&&#40;~0x40&#41;&#41;&#58;val|0x40;
str=&#40;val&0x40&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",val&#41;;
break;

case '8'&#58;
gotoxy&#40;45,9&#41;;
val=&#40;val&0x80&#41;?&#40;val&&#40;~0x80&#41;&#41;&#58;val|0x80;
str=&#40;val&0x80&#41;?str1&#58;str2;
printf&#40;"%s",str&#41;;
outportb&#40;PORT,val&#41;;
gotoxy&#40;1,13&#41;;
printf&#40;"%x",&#40;unsigned char&#41;val&#41;;
break;

&#125;

&#125;


&#125;


To κάνω compile σε borland C++ και βγάζει σφάλμα στο " outportb(PORT,29); " . Μπορεί κανείς να βοηθήσει ? Τη τροποποίηση χρειάζεται το πρόγραμμα ώστε να τρέξει ?

Ευχαρηστώ εκ των προτέρων .

[Edit=ThyClub]Έβαλα τον κώδικα σε code tags για καλύτερη ανάγνωση [/edit]
Συνημμένα
1.gif
1
(7.28 KiB) Μεταφορτώθηκε 474 φορές

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από dva_dev » 12 Δεκ 2008 18:31

Καλωσήρθες στο forum.

Δες τι μπορείς να κάνεις με το Universal Parallel Port I/O library

Φυσικά μην ξεχνάς να τσεκάρεις την άδεια χρήσης, και να δίνεις credits εκεί που πρέπει.

Η γνώμη μου είναι πάντως ότι αυτό το πράγμα είναι σκέτο χάλι. Καλύτερα ξαναγράψιμο από την αρχή και κράτα μόνο τον βασικό αλγόριθμο.



ΥΓ. Μου θύμισες κάποιον άλλο - αθάνατο - 2 χρόνια πριν (ίσως και περισσότερο).

master3763
Δημοσιεύσεις: 65
Εγγραφή: 12 Δεκ 2008 16:10
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από master3763 » 14 Δεκ 2008 22:59

Έψαξα πολύ αλλά δεν βρήκα τίποτα που να είναι χρήσιμο &#8230;
Μπορεί να μου πει κάποιος πώς θα φτιάξω ένα απλό script που μόλις τρέξουμε το πρόγραμμα να ενεργοποιείται ένα από τα D0-D7 (έξοδοι)?
Κε μία ακόμη ερώτηση . Μπορεί το αρχείο exe na to ανοίγω από το web ? Μέσω κάποιου php script ισος .. ώστε να το ελέγχω από μία ιστοσελίδα ??
Ευχαριστώ προκαταβολικά !

Άβαταρ μέλους
tix-3-
Δημοσιεύσεις: 827
Εγγραφή: 25 Μαρ 2004 05:12
Τοποθεσία: Θεσσαλονικη-Καβαλα-βεροια(το τριγωνο της καταρας)
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από tix-3- » 15 Δεκ 2008 11:21

Δες ξανα το link που σου εδωσε ο dva_dev.Κανει αυτο που θελεις και αρκετα ακομη.
Το να τρεξεις exe απο το internet ειναι λιγο δυκολο.
Μπορεις να βαλεις ενα timer στο .exe σου που να "διαβαζει" την κατασταση που θελεις να εχει η παραλληλη θυρα σου απο καποια σελιδα (συνηθως σε .xml) και να διαχειρζεσαι απο την σελιδα το τι θελεις να κανεις.
Αν δεν υπήρχανε οι κνίτες κι'η ηρωίνη...

master3763
Δημοσιεύσεις: 65
Εγγραφή: 12 Δεκ 2008 16:10
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από master3763 » 23 Ιούλ 2009 20:53

φίλε dva_dev το link που μου έδωσες δεν λειτουργεί ...

Βρήκα αυτόν εδώ τον κώδικα ποιο απλό από το προηγούμενο ...
Αλλά και πάλι δεν μπορώ να κάνω compile .
Γιατί ? Τη κάνω λάθος ?

Κώδικας: Επιλογή όλων

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

void main&#40;&#41;
&#123;
   int Address=888;
   cout<<"Test LPT port."<<endl;
   cout<<"Press '1' to activate and '0' to disactivate lightdiod."<<endl;
   cout<<"To exit press 'e'."<<endl;
   cout<<" "<<endl;

   while&#40;1&#41;
   &#123;      
      switch&#40;getch&#40;&#41;&#41;
      &#123;

         case '0'&#58;   cout<<"Disactivate...."<<endl;
                  _outp&#40;Address, 0&#41;;
                  break;          
         case '1'&#58;    cout<<"Activate...."<<endl;
                  _outp&#40;Address, 1&#41;;
                  break;
         case 'e'&#58; exit&#40;1&#41;;
      &#125;
   &#125;

   getch&#40;&#41;;
&#125;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από dva_dev » 24 Ιούλ 2009 14:28

Χρειάζεται να βάλεις πριν την main

Κώδικας: Επιλογή όλων

using namespace std;
ή να αλλάξεις τα

Κώδικας: Επιλογή όλων

cout -> std&#58;&#58;cout
endl -> std&#58;&#58;endl
Και κάτι άλλο, το σωστό είναι int main, όχι void main

john_h
Δημοσιεύσεις: 26
Εγγραφή: 16 Φεβ 2010 03:44
Τοποθεσία: Serres

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από john_h » 16 Φεβ 2010 04:07

εχω τρεξει το προγραμμα αυτο και με την διόρθωση που εχεις πει dva_dev αλλα δεν παιζει σε Borland C++ V. 5.02 και βασικα δεν αναγνωριζει τις συναρτησεις outport, outportb....

σε πολλα foroum που εχω διαβασει λενε (απ' οτι εχω καταλαβει) οτι τα OS XP δεν δινουν την αδεια για ελεγχο της μνημης τους απο προγραμματα.....
επισης εχω βρει κωδικες που ελέγχουν τις πορτες (και καλα! αφου δεν τρεχει κανενας (θελει να συμπεριλαβεις την βιβλιοθηκη της βιβλιοθής Ω!!! βιβλιοθηκη.....)και δημιουργεις καποιες κλασεις...........

αν μπορει καποιος ας δωσει την λυσει για το προηγουμενο απολο προγραμματακι στην C++ το χρειάζομαι αμεσα......

ευχαριστω εκ των προτερων ολους.....

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από dva_dev » 16 Φεβ 2010 05:56

τρέξε το σε dos, αν δεν βγάζει dos executable δοκίμασε να το κάνεις build με κάποιον παλιότερο compiler (π.χ. turbo c - http://www.top4download.com/turbo-c-/do ... qwuba.html)

john_h
Δημοσιεύσεις: 26
Εγγραφή: 16 Φεβ 2010 03:44
Τοποθεσία: Serres

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από john_h » 16 Φεβ 2010 11:58

παλι τα ιδια..............μου βγαζει το παρακάτω μηνημα στο προγραμμα

Κώδικας: Επιλογή όλων

#include <conio.h>
#include <dos.h> // For _out
#define port 0x378 // Port Address
#define data port+0 // Data Port of the parallel cable
void main &#40;void&#41;
&#123;
  _out&#40;data, 255&#41;; // For all lights on
  _out&#40;data, 0&#41;; // For all lights off
&#125;

_out should have a prototype

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από dva_dev » 16 Φεβ 2010 12:16

Μήπως δεν υπάρχει η _out, αλλά η _outp ή η outportb?

Για dos δες
http://electrosofts.com/parallel/
για windows δες
Universal Parallel Port I/O library στο http://sourceforge.net/projects/uniportio/
http://logix4u.net/Legacy_Ports/Paralle ... acing.html
http://logix4u.net/Legacy_Ports/Paralle ... NT/XP.html

Inpout32.dll for Windows 98/2000/NT/XP, download στο http://logix4u.net/inpout32_source_and_bins.zip

john_h
Δημοσιεύσεις: 26
Εγγραφή: 16 Φεβ 2010 03:44
Τοποθεσία: Serres

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από john_h » 16 Φεβ 2010 20:15

dva_dev κατεβασα το input32_dll και δικιμασα το test.c για Borland C και το τρεχω με το C++ v. 5.02 ολα καλα αλλα επειδη δεν κσερω πολλα απο C και δεν εναγνωρίζει την βιβλιοθηκη iostream.h που θα επρεπε λογικα γιατι η C ειναι υποσύνολο της C++ σωστά???

θελω απλα να δίνω τιμες στον 8ψηφιο buffer αλλα δεν αναγνωριζει οπως ειπα την cin και cout.....

μπορεις να δωσεις μια λυση? μεσω C η αν γίνεται να γράφω και σε C++ που θα με βολευε πολυ γιατι ξέρω C++.....

να διευκρινησω, επισυναπτω το αρχειο τυπου *.RAR το οποιο εχει το αρχικο προγραμα test.c (για να μην ψαχνεις) και το testwpp.c το οποιο ειναι το πιραγμενο προγραμμα !!! που εχει την συναρτηση oup32 στην main () εκει κατω και οχι τον ελεγχο που ειχε....
Συνημμένα
Borland C++ test program.rar
(2.1 KiB) Μεταφορτώθηκε 273 φορές

john_h
Δημοσιεύσεις: 26
Εγγραφή: 16 Φεβ 2010 03:44
Τοποθεσία: Serres

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από john_h » 17 Φεβ 2010 09:45

την δυναμικη βιβλιοθηκη " input32.dll " την βαζουμε στον φακελο system32 τον windows ή στον φακελο που υπαρχει το πρόγραμμα - κωδικας εκει που θελει η C++ " C:\BC5\BIN"?

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από dva_dev » 17 Φεβ 2010 19:47

Η σε κάποιο φάκελο που ψάχνουν τα windows να βρούν τα dlls (ενδεικτικά c:\windows, c:\windows\system32) ή στον φάκελο που τρέχει η εφαρμογή σου.
Αν το πρόγραμμα (το exe) που φτιάχνεις υπάρχει στον φάκελο c:\myprogs\ask1\debug, εκεί θα πρέπει να μπούν και τα dlls που χρησιμοποιεί.

john_h
Δημοσιεύσεις: 26
Εγγραφή: 16 Φεβ 2010 03:44
Τοποθεσία: Serres

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από john_h » 17 Φεβ 2010 20:49

στον φακελο που εκανα το προγραμμα δεν την αναγνωριζε την εβαλα στο system32 ολα οκ μοο με το test.c που εχει το input_32...*RAR που ανεβασα αλλα σε C++ πως μπορουμε να το μετατρεψουμς το προγραμματακι?

και με την C/C++ μπορουμε να δημιουργησουμε αρχεια *.exe? πως γινεται? συνηθως μονο σε ολοκληρωμενα περιβαλοντα οπως C++ Builder γινεται....

Κώδικας: Επιλογή όλων

/**************************************************/
/***                                            ***/
/*** TEST.c  -- test interface to inpout32.dll  ***/
/***  &#40; http&#58;//www.logix4u.net/inpout32.htm &#41;   ***/
/***                                            ***/
/*** Copyright &#40;C&#41; 2003, Douglas Beattie Jr.    ***/
/***                                            ***/
/***    <beattidp@ieee.org>                     ***/
/***    http&#58;//www.hytherion.com/beattidp/      ***/
/***                                            ***/
/**************************************************/


/*******************************************************/
/*                                                     */
/*  Builds with Borland's Command-line C Compiler      */
/*    &#40;free for public download from Borland.com, at   */
/*  http&#58;//www.borland.com/bcppbuilder/freecompiler &#41;  */
/*                                                     */
/*   Compile with&#58;                                     */
/*                                                     */
/*   BCC32 -IC&#58;\BORLAND\BCC55\INCLUDE  TEST.C          */
/*                                                     */
/*                                                     */
/*  Be sure to change the Port addresses               */
/*  accordingly if your LPT port is addressed          */
/*  elsewhere.                                         */
/*                                                     */
/*******************************************************/




#include <stdio.h>
#include <conio.h>
#include <windows.h>


/* Definitions in the build of inpout32.dll are&#58;            */
/*   short _stdcall Inp32&#40;short PortAddress&#41;;               */
/*   void _stdcall Out32&#40;short PortAddress, short data&#41;;    */


/* prototype &#40;function typedef&#41; for DLL function Inp32&#58; */

     typedef short _stdcall &#40;*inpfuncPtr&#41;&#40;short portaddr&#41;;
     typedef void _stdcall &#40;*oupfuncPtr&#41;&#40;short portaddr, short datum&#41;;

int main&#40;void&#41;
&#123;
     HINSTANCE hLib;
     inpfuncPtr inp32;
     oupfuncPtr oup32;

     short x;
     int i;

     /* Load the library */
     hLib = LoadLibrary&#40;"inpout32.dll"&#41;;

     if &#40;hLib == NULL&#41; &#123;
          printf&#40;"LoadLibrary Failed.\n"&#41;;
          return -1;
     &#125;

     /* get the address of the function */

     inp32 = &#40;inpfuncPtr&#41; GetProcAddress&#40;hLib, "Inp32"&#41;;

     if &#40;inp32 == NULL&#41; &#123;
          printf&#40;"GetProcAddress for Inp32 Failed.\n"&#41;;
          return -1;
     &#125;


     oup32 = &#40;oupfuncPtr&#41; GetProcAddress&#40;hLib, "Out32"&#41;;

     if &#40;oup32 == NULL&#41; &#123;
          printf&#40;"GetProcAddress for Oup32 Failed.\n"&#41;;
          return -1;
     &#125;


/***************************************************************/
/* now test the functions */

     /* Try to read 0x378..0x37F, LPT1&#58;  */

     for &#40;i=0x378; &#40;i<0x380&#41;; i++&#41; &#123;

          x = &#40;inp32&#41;&#40;i&#41;;

          printf&#40;"port read &#40;%04X&#41;= %04X\n",i,x&#41;;
     &#125;



     /*****  Write the data register */

     i=0x378;
     x=0x77;

     &#40;oup32&#41;&#40;i,x&#41;;

     printf&#40;"port write to 0x%X, datum=0x%2X\n" ,i ,x&#41;;

     /***** And read back to verify  */
     x = &#40;inp32&#41;&#40;i&#41;;
     printf&#40;"port read &#40;%04X&#41;= %04X\n",i,x&#41;;



     /*****  One more time, different value */

     i=0x378;
     x=0xAA;

     &#40;oup32&#41;&#40;i,x&#41;;

     printf&#40;"port write to 0x%X, datum=0x%2X\n" ,i ,x&#41;;

     /***** And read back to verify  */
     x = &#40;inp32&#41;&#40;i&#41;;
     printf&#40;"port read &#40;%04X&#41;= %04X\n",i,x&#41;;




     FreeLibrary&#40;hLib&#41;;
     return 0;
&#125;
[/quote]
Συνημμένα
test.rar
(1.07 KiB) Μεταφορτώθηκε 151 φορές

john_h
Δημοσιεύσεις: 26
Εγγραφή: 16 Φεβ 2010 03:44
Τοποθεσία: Serres

Ελεγχως Παράλληλης Θύρας με C++

Δημοσίευση από john_h » 18 Φεβ 2010 03:17

ολα οκ....το εκανα και σε C++ τρεχει...... 8) απλα το θεμα ηταν οτι δεν αναγνωριζε την βιβλιοθηκη στην αρχη (βασικα μαλλον δεν την εβαλα εκει που επρεπε στον φακελο system32)....

οποιος θελει ας μου πει να ανεβασω το προγραμμα σε C++ το οποιο περνει απο 0- 255 ακεραιες τιμες και τις στελνει στην παραλληλη πορτα του PC και κανει ενα verify μετα απο καθε τιμη (δηλαδη read port...)

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης