19 static speed_t baud(int speed)
21 if (speed == 230400) return B230400; else
22 if (speed == 115200) return B115200; else
23 if (speed == 57600) return B57600; else
24 if (speed == 38400) return B38400; else
25 if (speed == 19200) return B19200; else
26 if (speed == 9600) return B9600; else
27 if (speed == 4800) return B4800; else
28 if (speed == 2400) return B2400; else
29 if (speed == 1200) return B1200; else {
30 loge("Error setting baud rate: %d not recognised.", speed);
36 port_t * serial_open(const char *name, int speed)
41 if ((fd = open(name, O_RDWR | O_NOCTTY))<0) {
42 loge("Error: opening %s: %s", name, strerror(errno));
47 bzero(&adtio, sizeof(adtio));
49 tcgetattr(fd, &adtio);
50 adtio.c_cflag = CS8 | CLOCAL | CREAD;
51 adtio.c_iflag = IGNPAR | IGNBRK;
53 adtio.c_lflag = 0; // non-canon, no echo
57 adtio.c_cc[VTIME] = 0;
60 cfsetispeed(&adtio, baud(speed));
61 cfsetospeed(&adtio, baud(speed));
63 tcsetattr(fd, TCSANOW, &adtio);
65 pt = malloc(sizeof(port_t));
72 void serial_close(port_t * pt)
74 if (pt == NULL) return;
75 if (pt->fd < 0) return;
83 int serial_read(port_t * pt, unsigned char * buff, size_t len)
85 if (pt == NULL || pt->fd < 0) return -1;
89 unsigned char * p = buff;
91 ret = read(pt->fd, p, len-count);
92 if (ret <= 0) return ret;
99 int serial_write(port_t * pt, unsigned char * buff, size_t len)
101 if (pt == NULL || pt->fd < 0) return -1;
103 return write(pt->fd, buff, len);
106 int serial_break(port_t * pt, int set)
108 if (pt == NULL || pt->fd < 0) return -1;
111 ioctl(pt->fd, TIOCSBRK, 0);
113 ioctl(pt->fd, TIOCCBRK, 0);