diff options
-rw-r--r-- | Makefile | 33 | ||||
-rw-r--r-- | serial.c | 85 |
2 files changed, 118 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2f321cd --- /dev/null +++ b/Makefile @@ -0,0 +1,33 @@ +CC = clang +CLAGS = -Wall -g -std=c++11 +DEBUGFLAGS = -Wall -g -std=c++11 +LDFLAGS = +BUILDDIR = build +SOURCEDIR = src +OBJECTDIR = obj + +OUTPUT = program + +SRCS = $(wildcard $(SOURCEDIR)/*.cpp) +OBJS = $(SRCS:.cpp=.o) +OBJ = $(OBJS:$(SOURCEDIR)/%=$(OBJECTDIR)/%) + +build: dir $(OBJ) + @echo [LD] $(OBJ) + @$(CC) $(CFLAGS) -o $(BUILDDIR)/$(OUTPUT) $(OBJ) $(LDFLAGS) + +dir: + @mkdir -p $(OBJECTDIR) + @mkdir -p $(BUILDDIR) + +$(OBJECTDIR)/%.o: $(SOURCEDIR)/%.cpp + @echo [CC] $< + @$(CC) $(CFLAGS) -c $< -o $@ + +.PHONY: clean + +clean: + @echo [RM] $(OBJ) + @echo [RM] $(BUILDDIR)/$(OUTPUT) + @rm -df $(OBJ) + @rm -Rdf $(BUILDDIR) $(OBJECTDIR) diff --git a/serial.c b/serial.c new file mode 100644 index 0000000..63e8ba7 --- /dev/null +++ b/serial.c @@ -0,0 +1,85 @@ +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> + +int +set_interface_attribs (int fd, int speed, int parity) +{ + struct termios tty; + memset (&tty, 0, sizeof tty); + if (tcgetattr (fd, &tty) != 0) + { + error_message ("error %d from tcgetattr", errno); + return -1; + } + + cfsetospeed (&tty, speed); + cfsetispeed (&tty, speed); + + tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars + // disable IGNBRK for mismatched speed tests; otherwise receive break + // as \000 chars + tty.c_iflag &= ~IGNBRK; // disable break processing + tty.c_lflag = 0; // no signaling chars, no echo, + // no canonical processing + tty.c_oflag = 0; // no remapping, no delays + tty.c_cc[VMIN] = 0; // read doesn't block + tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout + + tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl + + tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls, + // enable reading + tty.c_cflag &= ~(PARENB | PARODD); // shut off parity + tty.c_cflag |= parity; + tty.c_cflag &= ~CSTOPB; + tty.c_cflag &= ~CRTSCTS; + + if (tcsetattr (fd, TCSANOW, &tty) != 0) + { + error_message ("error %d from tcsetattr", errno); + return -1; + } + return 0; +} + +void +set_blocking (int fd, int should_block) +{ + struct termios tty; + memset (&tty, 0, sizeof tty); + if (tcgetattr (fd, &tty) != 0) + { + error_message ("error %d from tggetattr", errno); + return; + } + + tty.c_cc[VMIN] = should_block ? 1 : 0; + tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout + + if (tcsetattr (fd, TCSANOW, &tty) != 0) + error_message ("error %d setting term attributes", errno); +} + + +... +char *portname = "/dev/ttyUSB1" + ... +int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC); +if (fd < 0) +{ + error_message ("error %d opening %s: %s", errno, portname, strerror (errno)); + return; +} + +set_interface_attribs (fd, B115200, 0); // set speed to 115,200 bps, 8n1 (no parity) +set_blocking (fd, 0); // set no blocking + +write (fd, "hello!\n", 7); // send 7 character greeting + +usleep ((7 + 25) * 100); // sleep enough to transmit the 7 plus + // receive 25: approx 100 uS per char transmit +char buf [100]; +int n = read (fd, buf, sizeof buf); // read up to 100 characters if ready to read |