#include #include #ifndef __USE_ISOC99 #define __USE_ISOC99 #endif #include #include "gpib.h" #include "serial-util.h" #define gputv(string, rv) do { \ int ____l = strlen(string); \ if (safewrite(fd, string, ____l) != ____l) return rv; \ if (safewrite(fd, "\r", 1) != 1) return rv; } while(0) #define gput(string) gputv(string, -1) int gpib_init(int fd) { gput("++mode 1"); gput("++auto 0"); gput("++eos 1"); gput("++eoi 1"); gput("++read_tmo_ms 4000"); gput("++eot_enable 1"); gput("++eot_char 13"); return 0; } int gpib_addr(int fd, int addr) { char s[128]; sprintf(s, "++addr %d", addr); gput(s); return 0; } int keithley_init(int fd) { double i; gput(":syst:beep:stat 1"); gput(":sour:func:mode curr"); gput(":sour:del 0"); gput(":sour:curr 0"); gput(":sour:curr:range:auto on"); gput(":outp on"); drain(fd); i = keithley_read(fd); if (isnan(i)) return -1; return 0; } int keithley_current(int fd, double amps) { char s[128]; sprintf(s, ":sour:curr %0.12f", amps); gput(s); return 0; } double keithley_read(int fd) { char s[128]; double i, dummy; gputv("read?", NAN); gputv("++read", NAN); if (fdgets(s, 128, fd, 2000) == NULL) return NAN; if (sscanf(s, "%lf,%lf,", &dummy, &i) != 2) return NAN; return i; } int keithley_off(int fd) { gput(":outp off"); return 0; } /* this function is for Keithley2002 Digital multimeter */ int keithley2002_init(int fd) { double i; gput(":trac:cle"); gput(":sens:curr:dc:rang:auto on"); gput(":sens:curr:dc:dig 8"); gput(":form:elem read"); gput(":init:cont off"); drain(fd); i = keithley2002_read(fd); if (isnan(i)) return -1; return 0; } int keithley2002_init2(int fd) { double i; gput(":trac:cle"); gput(":sens:curr:dc:rang:auto on"); gput(":sens:curr:dc:dig 8"); gput(":form:elem read, time"); gput(":syst:tst:type rel"); gput(":syst:tst:rel:res"); gput(":init:cont off"); drain(fd); i = keithley2002_read(fd); if (isnan(i)) return -1; return 0; } int keithley2002_init_volts(int fd) { double i; gput(":trac:cle"); gput(":sens:func 'volt:dc'"); gput(":sens:volt:dc:rang 5"); gput(":sens:volt:dc:dig 8"); gput(":form:elem read"); gput(":init:cont off"); drain(fd); i = keithley2002_read(fd); if (isnan(i)) return -1; return 0; } double keithley2002_read(int fd) { char s[128]; double i; gputv("read?", NAN); gputv("++read", NAN); if (fdgets(s, 128, fd, 2000) == NULL) return NAN; if (sscanf(s, "%lf", &i) != 1) return NAN; return i; } double keithley2002_read2(int fd, double *tx) { char s[128]; double i; gputv("read?", NAN); gputv("++read", NAN); if (fdgets(s, 128, fd, 2000) == NULL) return NAN; if (sscanf(s, "%lf,%lf", &i, tx) < 1) return NAN; return i; }