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
Lesezeichen