C++-Implementierung einer Funktion zum Auslesen des Digitalmultimeters.
Die Klasse fserialbase mit der Schnittstelleninitialisierung:
// fserialbase.h static const char * DEV1 = "/dev/ttyS0"; static const char * DEV2 = "/dev/ttyS1"; class fserialbase { private: FILE * com; public: fserialbase(const char * dev = DEV1); virtual ~fserialbase(); FILE * FilePtr(void) { return com; }; int FileNo(void) { return fileno(com); }; }; fserialbase::fserialbase(const char * dev) { com = fopen(dev, "r+"); setvbuf(com, NULL, _IONBF, 0); struct termios options; tcgetattr(FileNo(), &options); // get current options cfsetispeed(&options, B9600); // change to our default inputrate cfsetospeed(&options, B9600); // change to our default outputrate options.c_cflag |= (CLOCAL | CREAD); // change the controlflags options.c_cflag &= ~PARENB; // disable PARENB options.c_cflag &= ~CSTOPB; // disable CSTOPB options.c_cflag &= ~CSIZE; // mask the character size bits options.c_cflag |= CS8; // use 8-data bits options.c_cflag |= CRTSCTS; // enable HardwareFlowControl options.c_lflag &= ~ECHO; // echo off tcsetattr(FileNo(), TCSANOW, &options); // activate the changes immediately } fserialbase::~fserialbase() { fclose(com); } |
Die Klasse dmmvdc berücksichtigt die Erfordernisse des Digitalvoltmeters:
// dmmvdc.h #include "fserialbase.h" class dmmvdc : protected fserialbase { public: dmmvdc(); ~dmmvdc(); double voltage(); }; const char REMOTE[] = "REN\n"; const char VDC[] = "FUNC VDC\n"; const char LOCAL[] = "GTL\n"; const char READ[] = "VAL?\n"; dmmvdc::dmmvdc() : fserialbase(DEV2) { fprintf(FilePtr(), REMOTE); fprintf(FilePtr(), VDC); } dmmvdc::~dmmvdc() { fprintf(FilePtr(), LOCAL); } double dmmvdc::voltage() { char s[200]; int i; double volts; fprintf(FilePtr(), READ); for (i=0; i<200; i++) { read(FileNo(), s+i, 1); if (s[i]=='\n') break; } s[i] = '\0'; sscanf(s+4, "%lf", &volts); return volts; } |
Nach diesen Vorarbeiten wird das eigentliche Programm dann sehr kurz:
// voltage.cpp #include <stdio.h> #include <unistd.h> #include <termios.h> #include "dmmvdc.h" extern "C" void voltage(double * volts) { dmmvdc M; *volts = M.voltage(); } int main() { double volts; voltage(&volts); printf("%f\n", volts); return 0; } |
Die Funktion voltage() ist für Scilab passend implementiert und wird zur Spannungsmessung von Scilab aufgerufen. Das zusätzliche Hauptprogramm main() ist angehängt, um das Ganze auch eigenständig verwenden und testen zu können.