Datenerfassung unter Scilab: C++

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.