#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
char * scope_dev = "/dev/ttyS0";
int scope;
#define BUFSIZE 1024
char answer[BUFSIZE];
void gds_ask(char * cmd)
{
char c;
int k;
int ret;
printf("Rx: %s", cmd);
ret = write(scope, cmd, strlen(cmd));
if (ret == -1) {
perror("write()");
exit(1);
};
memset(answer, 0, BUFSIZE);
k = 0;
do {
ret = read(scope, &c, 1);
if (ret == -1) {
perror("read()");
break;
};
answer[k++] = c;
if (BUFSIZE == k) {
printf("Oops, not enough buffer space\n");
break;
}
} while ( c != '\n' );
printf("Tx: %s\n", answer);
}
#include <termios.h>
void set_tty(void)
{
struct termios options;
int r;
r = tcgetattr(scope, &options);
if (-1 == r) {
perror("tcgetattr()");
exit(1);
}
/* set 9600 8N1 */
/* no parity bit */
options.c_cflag &= ~PARENB;
/* one stop bit */
options.c_cflag &= ~CSTOPB;
/* 8 bit symbols */
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
/* no RTS/CTS handshake */
options.c_cflag &= ~CRTSCTS;
/* baud rate == 9600 */
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
/* disable modem control signals and enable rx */
options.c_cflag |= (CLOCAL | CREAD);
/* raw mode */
options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
options.c_oflag &= ~(OPOST);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG | IEXTEN);
r = tcsetattr(scope, TCSANOW, &options);
if (-1 == r) {
perror("tcsetattr()");
exit(1);
}
}
int main(void)
{
printf("Opening %s ... ", scope_dev);
fflush(stdout);
scope = open(scope_dev, O_RDWR);
if (scope == -1) {
perror("open()");
exit(1);
};
printf("OK\n");
printf("Setting tty... ");
fflush(stdout);
set_tty();
printf("OK\n");
gds_ask("*IDN?\n");
exit(0);
}