Πρόσβαση στην παράλληλη θύρα

Giorgos Keramidas keramida at ceid.upatras.gr
Fri Apr 28 01:32:07 EEST 2006


On 2006-04-28 00:54, Chameleon <cham_gss at hotmail.com> wrote:
> Έχουμε φτιάξει ένα CNC μηχάνημα το οποίο το χειριζόμαστε μέσω παράλληλης
> θύρας.
>
> Δυστηχώς είμαστε εντελώς άσχετοι στο να φτιάξουμε ένα driver για Windows
> κι έτσι τη χειριζόμαστε μέσω των εντολών assembly IN και OUT από DOS.
>
> Επειδή το DOS είναι λίγο deprecated πλέον, (για να μην πω και η
> παράλληλη θύρα) αποφασίσαμε να κάνουμε τον driver σε ένα ζωντανό
> λειτουργικό που είναι ή τα Windows ή το Linux.
>
> Η γενική ιδέα οτι όλες οι συσκευές είναι αρχεία και μπορούμε να γράφουμε
> και να διαβάζουμε απο αυτές μας ενθουσίασε. Αποφασίσαμε λοιπόν Linux.
> (Αλλωστε δεν χρειάζεται να ξέρουμε και πολλά. Ξέρουμε SDL, wxWidgets,
> C++ αυτά φτάνουν, συν οτι μαθαίνω Qt)
>
> Επειδή είδα οτι πολλοί ξέρουν να προγραμματίζουν εδώ μέσα σε Linux, θα
> παρακαλούσα αν κάποιος ξέρει να μου πει τι πρέπει να κάνω για να στέλνω
> με μια δειγματοληψία *ακριβώς* 50000bytes/sec στην παράλληλη θύρα.

Για να τρέχει κάποιο κομμάτι από το πρόγραμμά σου σε τακτά χρονικά
διαστήματα, χρειάζεσαι -- λογικά -- ένα high-precision timer, όπως
π.χ. αυτά που μπορεί να σου δώσει η κλήση setitimer() με ITIMER_REAL
τύπο, και ένα καλό signal handler για να προλαβαίνεις όλα αυτά τα
SIGALRM.

Εναλλακτικά, ένα polling loop με nanosleep(), μπορεί να είναι πιο καλό
αν μόνο αυτό θες να κάνει το πρόγραμμα.

Για να γράψεις στην παράλληλη, αρκεί να έχεις δικαιώματα/permissions στο
κατάλληλο device node και να ανοίξεις για γράψιμο το "/dev/lp0",
"/dev/lp1" ή όποια άλλη παράλληλη θύρα θέλεις.

Ο κώδικας για γράψιμο δε θα πρεπε να είναι ιδιαίτερα πιο περίπλοκος από
κάτι σαν:

   1  #include <sys/types.h>
   2  #include <sys/stat.h>
   3
   4  #include <errno.h>
   5  #include <fcntl.h>
   6  #include <stdio.h>
   7  #include <string.h>
   8  #include <sysexits.h>
   9  #include <unistd.h>
  10
  11  #ifndef PARALLEL_PORT
  12  #define PARALLEL_PORT   "/dev/lp0"
  13  #endif
  14
  15  int
  16  main(void)
  17  {
  18          unsigned char buf[256];
  19          size_t k;
  20          int fd;
  21
+ 22          fd = open(PARALLEL_PORT, O_RDWR, S_IREAD | S_IWRITE);
+ 23          if (fd == -1) {
+ 24                  fprintf(stderr,
+ 25                      "error: open: %s: %s\n",
+ 26                      PARALLEL_PORT, strerror(errno));
+ 27                  fflush(stderr);
+ 28                  return EX_OSFILE;
+ 29          }
  30
  31          for (k = 0; k < sizeof(buf); k++)
  32                  buf[k] = (unsigned char)(k % 0xff);
  33
+ 34          if (write(fd, buf, sizeof(buf)) == -1) {
+ 35                  fprintf(stderr,
+ 36                      "error: open: %s: %s\n",
+ 37                      PARALLEL_PORT, strerror(errno));
+ 38                  fflush(stderr);
+ 39                  return EX_IOERR;
+ 40          }
  41
+ 42          (void) close(fd);
  43          return 0;
  44  }

Οι πιο σημαντικές γραμμές είναι σημειωμένες με '+'.




More information about the Linux-greek-users mailing list