PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Unter UNIX/Linux Devices auslesen



Stefan Feeser
22-06-2006, 16:31
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:D)

Gruß und Danke

Stefan

Caveman
22-06-2006, 16:39
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.

Stefan Feeser
23-06-2006, 07:57
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":D, weisst Du was ich sagen will?

Gruss

Stefan

Caveman
23-06-2006, 10:48
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:


/* 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

Stefan Feeser
23-06-2006, 12:24
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

baumgartner
25-06-2006, 19:53
http://www.pronix.de/pronix-6.html

sucht ihr vielleicht dieses hier?