/***************************************************************************
cserial.h - description
-------------------
begin : Mit Mai 28 2003
copyright : (C) 2003 by Markus Raab
email : markus.raab@aon.at
***************************************************************************/
#ifndef CSERIAL_H
#define CSERIAL_H
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/**
@author Markus Raab
Diese Klasse bietet ihnen Zugriff auf
die seriellen Schnittstellen unter allen
unix-ähnlichen Betriebsystemen. Die Verwendung
ähnelt sehr stark dem Konzept von den
c++-Streams (wie iostream,...).
Folgende Seiten können ihnen weitere Tipps
zu der serielle Schnittstelle geben:
http://www.easysw.com/~mike/serial/serial.html
http://en.tldp.org/HOWTO/Serial-Programming-HOWTO/index.html
http://www.camiresearch.com/Data_Com_Basics/RS232_standard.html*/
class CSerial {
/**Methoden zum öffnen und Schließen der serielle Schnittstelle*/
public:
CSerial ();
/**Konstruktor der auch gleich die serielle Schnittstelle
öffnet. Zu beachten ist, dass in diesem Fall die Defaulteinstellung
für die Übertragungsraten verwendet werden müssen.*/
CSerial (const char * port);
/**Öffnet die serielle schnittstelle mit den
aktuellen Einstellungen.
Für port ist je nach verwendeten Betriebsystem und
gewünschte Schnittstelle:
IRIX® /dev/ttyf1 /dev/ttyf2
HP-UX /dev/tty1p0 /dev/tty2p0
Solaris®/SunOS® /dev/ttya /dev/ttyb
Linux® /dev/ttyS0 /dev/ttyS1
Digital UNIX® /dev/tty01 /dev/tty02
*/
int open (const char * port);
/**Setzt die Optionen neu im offnen Filedeskriptor*/
int reopen ();
/**Führe den Initalisierungsprozess unabhängig von dem Konstruktor
aus.*/
void init();
~CSerial ();
int close();
/**Methoden zum Setzen von Optionen.*/
public:
/**Setzt die Baudrate auf einen bestimmten Wert.
Gültig sind folgende Werte:
- #define B0 0000000 // hang up
- #define B50 0000001
- #define B75 0000002
- #define B110 0000003
- #define B134 0000004
- #define B150 0000005
- #define B200 0000006
- #define B300 0000007
- #define B600 0000010
- #define B1200 0000011
- #define B1800 0000012
- #define B2400 0000013
- #define B4800 0000014
- #define B9600 0000015
- #define B19200 0000016
- #define B38400 0000017
welche in der Datei bits/termios.h definiert sind.
Wenn sie Systemunabhängig bleiben wollen, ist es ratsam
die Konstante zu verwenden, und nicht den Zahlenwert!*/
int setBaud (speed_t Baudrate = B9600);
/**Gibt an, wie viele Bits verwendet werden sollen.
Möglich sind Werte von 5 bis 8
- #define CS5 0000000
- #define CS6 0000020
- #define CS7 0000040
- #define CS8 0000060
welche in der Datei bits/termios.h definiert sind.
Wenn sie Systemunabhängig bleiben wollen, ist es ratsam
die Konstante zu verwenden, und nicht den Zahlenwert!*/
int setBits (tcflag_t Bits = CS8);
/**Gibt an, ob sie zwei Stoppbits oder nur einen haben
wollen*/
int setStop (bool TwoStopBits = false);
/**Gibt an, ob sie mit Parität arbeiten wollen, oder
nicht*/
int setPari (bool Parity = false);
/**Schaltet zusätliche Ausgabe, welche nützlich für das
Testen von Programmen ist, ein oder aus*/
int setDebug (bool Debug = false);
/**Sollte ein Microcontroller nicht mitlesen können,
kann man kurze Wartezeiten beim senden einbauen
Die Zeit ist in Microsekunden angegeben.
Wenn sie diese Funktion in Anspruch nehmen, sollten
sie aber nur send_char und empfange_char verwenden,
da bei den anderen Typen, mehere Bytes hintereinander
gesendet werden, bis die zur nächste Wartepause.*/
int setWait (int TimeToWaitInMicroSec);
/**Zusätliche diverse Methoden*/
public:
/**Gibt einen Wert in allen gängigen Zahlenformate
aus (Okt, Hex, Dez, char).
Dies wird automatisch ausgeführt, wenn Debug
eingeschalten ist.*/
void ausgeben (const unsigned char * buffer,
const int length,
const char modus
);
int send_char (const unsigned char wert);
/**Das universelle Ausgeben der Klasse.*/
void send (void * buffer, int length);
unsigned char empfange_char ();
void empfange (void * buffer, int length);
int empfange_string (string str);
void warte_kurz ();
/**Streamoperatoren für Ein- und Ausgabe*/
public:
/**Ausgabe*/
CSerial & operator << (const char);
CSerial & operator << (const int);
CSerial & operator << (const long int);
#if defined __GNUC__
CSerial & operator << (const long long);
#endif
CSerial & operator << (const float);
CSerial & operator << (const double);
#if _G_HAVE_BOOL
CSerial & operator << (const bool);
#endif
CSerial & operator << (const char *);
CSerial & operator << (string);
/**Eingabe*/
CSerial & operator >> (char);
CSerial & operator >> (int);
CSerial & operator >> (long int);
#if defined __GNUC__
CSerial & operator >> (long long);
#endif
CSerial & operator >> (float);
CSerial & operator >> (double);
#if _G_HAVE_BOOL
CSerial & operator >> (bool);
#endif
CSerial & operator >> (char *);
CSerial & operator >> (string);
private:
/**Filedeskriptor für serielle Schnittstelle
-1 wenn nicht geöffnet sonst >2*/
int Cfd;
/**Gibt wenn gesetzt exakte Informationen auf stderr (da
stderr ungepuffert) über den Vorgang aus.*/
int CDebug;
/**Sollte ein Microcontroller nicht mitlesen können,
kann man kurze Wartezeiten beim senden einbauen*/
int CWait;
/**Gesetzte Optionen*/
struct termios options;
};
#endif