freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

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


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [15 Μηνύματα]      Bookmarks Tags: cΠρόγραμμα Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
master3763


Μέλος από: 12 Δεκ 2008
Μηνύματα: 65

View users profile Visit posters website
ΜήνυμαΣτις: 12 Δεκ 2008 16:25    Θέμα: Ελεγχως Παράλληλης Θύρας με C++
Περιγραφή θέματος: Πρόγραμμα που ελέγχει διακόπτες (rele)
Απάντηση με παράθεση  Mark this post and the followings unread

Καλησπέρα σε όλους ! Είναι πρώτη φωρα που γράφω στο 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()
{
char val=0,key=0;
char str1[]="ON ";
char str2[]="OFF";
char *str;
clrscr();
printf("Press the approriate number key to turn on/off devices:\n\n");
printf("Here Device1 is connected to D0 of parallel port and so on\n\n");
printf("Press \"x\" to quit\n\n");
gotoxy(1,8);
printf("Device1:OFF Device2:OFF Device3:OFF Device4:OFF\n");
printf("Device5:OFF Device6:OFF Device7:OFF Device8:OFF");

while(key!='x' && key!='X')
{
gotoxy(1,12);
printf("Value in hex sent to the port:");
key=getch();
switch(key){

case '1':

gotoxy(9,8);
val=(val&0x01)?(val&(~0x01)):val|0x01;
str=(val&0x01)?str1:str2;
printf("%s",str);
outportb(PORT,val);
gotoxy(1,13);
printf("%x",val);
break;

case '2':

gotoxy(21,8);
val=(val&0x02)?(val&(~0x02)):val|0x02;
str=(val&0x02)?str1:str2;
printf("%s",str);
outportb(PORT,val);
gotoxy(1,13);
printf("%x",val);
break;

case '3':

gotoxy(33,8);
val=(val&0x04)?(val&(~0x04)):val|0x04;
str=(val&0x04)?str1:str2;
printf("%s",str);
outportb(PORT,val);
gotoxy(1,13);
printf("%x",val);
break;

case '4':

gotoxy(45,8);
val=(val&0x08)?(val&(~0x08)):val|0x08;
str=(val&0x08)?str1:str2;
printf("%s",str);
outportb(PORT,val);
gotoxy(1,13);
printf("%x",val);
break;

case '5':

gotoxy(9,9);
val=(val&0x10)?(val&(~0x10)):val|0x10;
str=(val&0x10)?str1:str2;
printf("%s",str);
outportb(PORT,val);
gotoxy(1,13);
printf("%x",val);
break;

case '6':

gotoxy(21,9);
val=(val&0x20)?(val&(~0x20)):val|0x20;
str=(val&0x20)?str1:str2;
printf("%s",str);
outportb(PORT,val);
gotoxy(1,13);
printf("%x",val);
break;

case '7':

gotoxy(33,9);
val=(val&0x40)?(val&(~0x40)):val|0x40;
str=(val&0x40)?str1:str2;
printf("%s",str);
outportb(PORT,val);
gotoxy(1,13);
printf("%x",val);
break;

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

}

}


}




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

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

[Edit=ThyClub]Έβαλα τον κώδικα σε code tags για καλύτερη ανάγνωση [/edit]



1.gif
 Description:
1

Download
 Filename:  1.gif
 Filesize:  7.28 KB
 Downloaded:  474 Time(s)

dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 12 Δεκ 2008 18:31    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

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

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



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


Μέλος από: 12 Δεκ 2008
Μηνύματα: 65

View users profile Visit posters website
ΜήνυμαΣτις: 14 Δεκ 2008 22:59    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 25 Μαρ 2004
Βοηθήματα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Θεσσαλονικη-Καβαλα-βεροια(το τριγωνο της καταρας)
View users profile Visit posters website
ΜήνυμαΣτις: 15 Δεκ 2008 11:21    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

_________________
Αν δεν υπήρχανε οι κνίτες κι'η ηρωίνη...
master3763


Μέλος από: 12 Δεκ 2008
Μηνύματα: 65

View users profile Visit posters website
ΜήνυμαΣτις: 23 Ιουλ 2009 19:53    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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


κώδικας:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

void main()
{
   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(1)
   {     
      switch(getch())
      {

         case '0':   cout<<"Disactivate...."<<endl;
                  _outp(Address, 0);
                  break;         
         case '1':    cout<<"Activate...."<<endl;
                  _outp(Address, 1);
                  break;
         case 'e': exit(1);
      }
   }

   getch();
}
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 24 Ιουλ 2009 13:28    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Χρειάζεται να βάλεις πριν την main
κώδικας:
using namespace std;

ή να αλλάξεις τα
κώδικας:
cout -> std::cout
endl -> std::endl


Και κάτι άλλο, το σωστό είναι int main, όχι void main
john_h


Μέλος από: 16 Φεβ 2010
Μηνύματα: 26
Περιοχή: Serres
View users profile
ΜήνυμαΣτις: 16 Φεβ 2010 04:07    Θέμα: heeeeeeelp..........................!!!! Απάντηση με παράθεση  Mark this post and the followings unread

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

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

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

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

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 16 Φεβ 2010 05:56    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 16 Φεβ 2010
Μηνύματα: 26
Περιοχή: Serres
View users profile
ΜήνυμαΣτις: 16 Φεβ 2010 11:58    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


κώδικας:
#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 (void)
{
  _out(data, 255); // For all lights on
  _out(data, 0); // For all lights off
}



_out should have a prototype
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 16 Φεβ 2010 12:16    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Μήπως δεν υπάρχει η _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/Parallel_Port/A_tutorial_on_Paralle..._Interfacing.html
http://logix4u.net/Legacy_Ports/Parallel_Port/Inpout32.dll_for_Wind...8/2000/NT/XP.html

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


Μέλος από: 16 Φεβ 2010
Μηνύματα: 26
Περιοχή: Serres
View users profile
ΜήνυμαΣτις: 16 Φεβ 2010 20:15    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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
 Description:

Download
 Filename:  Borland C++ test program.rar
 Filesize:  2.1 KB
 Downloaded:  262 Time(s)

john_h


Μέλος από: 16 Φεβ 2010
Μηνύματα: 26
Περιοχή: Serres
View users profile
ΜήνυμαΣτις: 17 Φεβ 2010 09:45    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 17 Φεβ 2010 19:47    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 16 Φεβ 2010
Μηνύματα: 26
Περιοχή: Serres
View users profile
ΜήνυμαΣτις: 17 Φεβ 2010 20:49    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

κώδικας:
/**************************************************/
/***                                            ***/
/*** TEST.c  -- test interface to inpout32.dll  ***/
/***  ( http://www.logix4u.net/inpout32.htm )   ***/
/***                                            ***/
/*** Copyright (C) 2003, Douglas Beattie Jr.    ***/
/***                                            ***/
/***    <beattidp@ieee.org>                     ***/
/***    http://www.hytherion.com/beattidp/      ***/
/***                                            ***/
/**************************************************/


/*******************************************************/
/*                                                     */
/*  Builds with Borland's Command-line C Compiler      */
/*    (free for public download from Borland.com, at   */
/*  http://www.borland.com/bcppbuilder/freecompiler )  */
/*                                                     */
/*   Compile with:                                     */
/*                                                     */
/*   BCC32 -IC:\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:            */
/*   short _stdcall Inp32(short PortAddress);               */
/*   void _stdcall Out32(short PortAddress, short data);    */


/* prototype (function typedef) for DLL function Inp32: */

     typedef short _stdcall (*inpfuncPtr)(short portaddr);
     typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);

int main(void)
{
     HINSTANCE hLib;
     inpfuncPtr inp32;
     oupfuncPtr oup32;

     short x;
     int i;

     /* Load the library */
     hLib = LoadLibrary("inpout32.dll");

     if (hLib == NULL) {
          printf("LoadLibrary Failed.\n");
          return -1;
     }

     /* get the address of the function */

     inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

     if (inp32 == NULL) {
          printf("GetProcAddress for Inp32 Failed.\n");
          return -1;
     }


     oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");

     if (oup32 == NULL) {
          printf("GetProcAddress for Oup32 Failed.\n");
          return -1;
     }


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

     /* Try to read 0x378..0x37F, LPT1:  */

     for (i=0x378; (i<0x380); i++) {

          x = (inp32)(i);

          printf("port read (%04X)= %04X\n",i,x);
     }



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

     i=0x378;
     x=0x77;

     (oup32)(i,x);

     printf("port write to 0x%X, datum=0x%2X\n" ,i ,x);

     /***** And read back to verify  */
     x = (inp32)(i);
     printf("port read (%04X)= %04X\n",i,x);



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

     i=0x378;
     x=0xAA;

     (oup32)(i,x);

     printf("port write to 0x%X, datum=0x%2X\n" ,i ,x);

     /***** And read back to verify  */
     x = (inp32)(i);
     printf("port read (%04X)= %04X\n",i,x);




     FreeLibrary(hLib);
     return 0;
}
[/quote]



test.rar
 Description:

Download
 Filename:  test.rar
 Filesize:  1.07 KB
 Downloaded:  134 Time(s)

john_h


Μέλος από: 16 Φεβ 2010
Μηνύματα: 26
Περιοχή: Serres
View users profile
ΜήνυμαΣτις: 18 Φεβ 2010 03:17    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

οποιος θελει ας μου πει να ανεβασω το προγραμμα σε C++ το οποιο περνει απο 0- 255 ακεραιες τιμες και τις στελνει στην παραλληλη πορτα του PC και κανει ενα verify μετα απο καθε τιμη (δηλαδη read port...)
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [15 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++


Σχετικά θέματα
 Θέματα   Απ/σεις   Αποστολέας   Τελευταίο μήνυμα 
ενας κωδικας σε C που βγαζει μη αναμενομενο αποτεσμα 1 teresa92 13 Αυγ 2016 21:26
teresa92 Εμφάνιση τελευταίου μηνύματος
Bitwise operators in C 3 Kappa4 15 Δεκ 2014 20:38
mariosal Εμφάνιση τελευταίου μηνύματος
 
Τώρα είναι 07 Δεκ 2016 14:29 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos