Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Perl: Unter UNIX/Linux Devices auslesen

  1. #1
    Registrierter Benutzer Avatar von Stefan Feeser
    Registriert seit
    13.02.2000
    Ort
    Karlstein
    Beiträge
    50

    Question Perl: Unter UNIX/Linux Devices auslesen

    Hi,

    ich habe mir vor kurzem eine Wetterstation gekauft und würde gerne die Daten über die Serielle Schnittstelle auslesen. Dazu habe ich mir unter CPAN das Modul Device::SerialPort angesehen. Da ich noch ein paar andere Geräte habe die ich künftig gerne auslesen würde, wie z. B. ein GPS Gerät und einen Smartcardsleser würde ich mich gerne mit dem Thema intensiver befassen. Daher zwei Fragen:

    - hat jemand zufällig ein Beispielskript, an dem man erkennt wie man grundsätzlich Devices ausliest
    - gibt es für Perl Literatur oder Webseiten wo man einen guten Einstieg in dieses Thema bekommt (idealerweise in Deutsch, da ich faul bin)

    Gruß und Danke

    Stefan
    Dipl.-Ing.(FH) Forstwirtschaft
    Stefan Feeser

    https://familie-feeser.net

  2. #2
    Registrierter Benutzer Avatar von Caveman
    Registriert seit
    03.11.2005
    Ort
    Geilsheim
    Beiträge
    308
    Als Webseite für Perl, empfehle ich mal die von meinem Prof.:
    http://www.netzmafia.de/skripten/perl/index.html

    Das Auslesen der Seriellen Schnittstelle würde ich über ein C-Programm machen und dessen Ausgabe mit Perl weiter verarbeiten. So hab's ich zumindest kürzlich gemacht.
    Programmiere (wenn es denn mal wieder vorkommt) in C, C++, Java, Perl
    Bin kein Student (Elektrotechnik) mehr und habe die Seiten gewechselt von der Software weg hin zur Hardware

  3. #3
    Registrierter Benutzer Avatar von Stefan Feeser
    Registriert seit
    13.02.2000
    Ort
    Karlstein
    Beiträge
    50

    Question

    Danke,

    da ich in C und C++ gerade einen Programmierkurs absolviere (hatte zwar während dem Studium auch mal ein wenig C, das war aber nicht der Rede wert) und ich die Sprache(n) richtig lernen will wäre es klasse, wenn Du mir auch eine Seite nennen kannst wo ich ein Beispiel finden kann bzw. wo auch der Umgang in C mit Devices beschrieben ist (mir ist z. B. noch nicht klar wie man da programmatisch ran geht, sprich wo sind die Unterschiede zwischen Blockdevices und Characterdevices aus Programmierersicht, was unterscheidet ein Devicefile von einem normalen File unter UNIX, etc.).

    Ich habe von Helmut Herold Linux/UNIX Grundlagen und habe gesehen, dass da eine ganze Menge drin steht, ist aber ziemlich harter Tobak und ich bräuchte vielleicht erst mal sowas wie "Wat isn Dampfmaschien", weisst Du was ich sagen will?

    Gruss

    Stefan

  4. #4
    Registrierter Benutzer Avatar von Caveman
    Registriert seit
    03.11.2005
    Ort
    Geilsheim
    Beiträge
    308
    Ich hab das Buch Linux/UNIX Systemprogrammierung aus der gleichen Reihe, was mir gut geholfen hat.

    Einen Link zu einer Webseite hab ich nicht, aber da ich gestern meine Diplomarbeit abgeschlossen habe und gut drauf bin, hier der Code aus meinem C-Programm:

    Code:
    /* port.c
    
       erstellt am 9. Februar 2006
                von Michael Dommel
    
       zuletzt ueberarbeitet am 10. Mai 2006
    
    */
    
    #include <stdlib.h>         /* EXIT_SUCCESS */
    #include <errno.h>
    
    #include <unistd.h>         /* STDOUT_FILENO */
    #include <fcntl.h>          /* File control definitions */
    #include <termios.h>        /* POSIX terminal control definitions */
    
    #include <poll.h>           /* Polling */
    #include <stropts.h>        /* INFTIM */
    
    #define TIMEOUT 30000       /* Zeitueberlauf nach 30 Sek */
    
    #define BUFFERSIZE 40       /* Puffergroesse */
    
    char* error_open    =
    "sensor-rs232interface: Fehler beim Oeffnen der RS232-Schnittstelle\n";
    char* error_options =
    "sensor-rs232interface: Fehler bei der Abfrage der Optionen\n";
    char* error_aktiv   =
    "sensor-rs232interface: Fehler beim Aktivieren der Optionen\n";
    char* error_timeout =
    "sensor-rs232interface: keine Daten - timeout-Fehler\n";
    char* error_polling =
    "sensor-rs232interface: keine Daten - polling-Fehler\n";
    char* error_read    =
    "sensor-rs232interface: Fehler beim Lesen\n";
    
    int set_port();
    int read_port(int);
    void exit_error(char*);
    
    int main()
    {
      read_port( set_port() );
    
      return EXIT_SUCCESS;
    }
    
    int set_port()
    {
      /** Diese Funktion stellt die Schnittstelle zum RS232 Port zur Verfuegung.  *
       *  Gleichzeitig werden die Optionen so eingestellt, dass ein Abfragen der  *
       *  Daten moeglich ist.                                                     *
       *  Zurueck gegeben wird der Filedeskriptor.                                */
    
      int fd;                                       /* File-Deskriptor */
      struct termios options;                       /* Optionen Schnittstelle */
    
      /* oeffnen der Schnittstelle - nur lesen, nicht blockierend */
      if ((fd = open("/dev/ttyS0",O_RDONLY | O_NONBLOCK)) < 0)
        exit_error(error_open);
    
      if ( tcgetattr(fd, &options) < 0 )
        exit_error(error_options);
    
      /* Uebertragungsgeschwindigkeit */
      cfsetispeed(&options, B4800);                 /* 4800 Baud */
    
      /* Terminalflags */
      options.c_cflag &= ~CSTOPB;                   /* 1 Stopbit */
      options.c_cflag &= ~PARENB;                   /* keine Paritaet */
      options.c_cflag &= ~CSIZE;                    /* Bits auf 0 setzen */
      options.c_cflag |=  CS8;                      /* 8 Datenbits */
      options.c_cflag |=  CREAD;                    /* Zeichen empfangen */
    
      options.c_iflag |=  ICRNL;                    /* Umwandeln CR -> NL */
      options.c_iflag &= ~IGNCR;                    /* Ignorieren von CR */
      options.c_iflag &= ~IUCLC;                    /* Grossbuchstaben belassen */
    
      options.c_lflag |=  ICANON;                   /* zeilenorientiert */
      options.c_lflag &= ~IEXTEN;                   /* Zeichensatz nicht erweitern*/
    
      if ( tcsetattr(fd, TCSANOW, &options) != 0 )  /* Optionen schreiben */
        exit_error(error_aktiv);
    
      return fd;
    }
    
    int read_port(int fd)
    {
      /** Diese Funktion liest einen Datensatz der seriellen Schnittstelle aus    *
       *  und gibt diesen nach STDOUT.                                            *
       *  Uebergeben wird der Filedeskriptor.                                     */
    
      int n=0;                                      /* Anzahl gelesener Daten */
      char buffer[BUFFERSIZE];                      /* Lesepuffer */
      struct pollfd pfd = {fd, POLLIN, (short)NULL};/* polling-Optionen */
    
      do {
        n = poll(&pfd, 1, TIMEOUT);                 /* warten auf Eingabepuffer */
        if ( n == 0 )
          exit_error(error_timeout);
        if ( n < 0 )
          exit_error(error_polling);
    
        n = read(fd, buffer, BUFFERSIZE);
        if ( n < 0 )
          exit_error(error_read);
    
        write(STDOUT_FILENO, buffer, n);            /* Ausgabe Messung */
      } while (buffer[0] != '$');                   /* Ende Datensatz */
    
      close(fd);                                    /* Schnittstelle schliessen */
    
      return 1;
    }
    
    void exit_error(char* err)
    {
      /** Diese Funktion beendet das Programm mit einer Fehlermeldung.            */
    
      write(STDOUT_FILENO, err, strlen(err));
      exit(1);
    }
    Mit "/dev/ttyS0" wird die (erste) RS232-Schnittstelle geöffnet (wie eine Datei).
    Die einzelnen Optionen habe ich alle aus dem angesprochenen Buch. Ich habe sie (denke ich) gut kommentiert. Sollten dennoch Fragen bleiben, kann ich Dir da auch weiterhelfen.

    Die Windows-typischen Endezeichen <CR> werden in <NL> umgewandelt.
    (carrige return bzw. newline)

    Zum Lesen der Daten wird eine polling-Funktion eingerichtet.
    Damit wird die CPU-Last extrem minimiert.

    Gelesen wird sobald Daten ankommen bis zu einem $-Zeichen (ist in meinem Fall das Ende-Zeichen).


    schönen Gruß
    Michael
    Programmiere (wenn es denn mal wieder vorkommt) in C, C++, Java, Perl
    Bin kein Student (Elektrotechnik) mehr und habe die Seiten gewechselt von der Software weg hin zur Hardware

  5. #5
    Registrierter Benutzer Avatar von Stefan Feeser
    Registriert seit
    13.02.2000
    Ort
    Karlstein
    Beiträge
    50

    Thumbs up

    Das ist aber supernett!!! Ich habe mich übrigens vertippt, ich meinte auch das Buch "Systemprogrammierung" aus der Reihe. Das meinte ich auch mit "Tobak" :-).

    Ich wurschtel mich mal durch Deinen Code durch! Bei dem ersten Überblick und dank Deiner Kommentare denke ich dass ich damit klar komme

    Nochmals vielen Dank und schönes Wochenende

    Stefan

  6. #6
    Registrierter Benutzer
    Registriert seit
    15.04.2005
    Beiträge
    105
    http://www.pronix.de/pronix-6.html

    sucht ihr vielleicht dieses hier?
    Zitat Zitat von elrond
    Das problem ist der grosse Vorteil von php: die leichte erlernbarkeit. Es ist wie bei windows: CD rein und geht...aber eben nur ein bischen ;)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •