Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <unistd.h> #include <string.h> #include <fcntl.h> #include <sys/time.h> #include "serial.h" #if defined(__sun__) || \ defined(__OpenBSD__) || \ defined(__FreeBSD__) || \ defined(__NetBSD__) || \ defined(__APPLE__) static struct termios tios = { BRKINT, 0, B115200|CS8|CREAD, 0, { 0 } }; #else static struct termios tios = { BRKINT, 0, B115200|CS8|CREAD, 0, 0 }; #endif static struct speedmap { char *str; speed_t val; } speedmap[] = { { "50", B50 }, { "75", B75 }, { "110", B110 }, { "134", B134 }, { "150", B150 }, { "200", B200 }, { "300", B300 }, { "600", B600 }, { "1200", B1200 }, { "1800", B1800 }, { "2400", B2400 }, { "4800", B4800 }, { "9600", B9600 }, { "19200", B19200 }, { "38400", B38400 }, { "57600", B57600 }, #ifdef B76800 { "76800", B76800 }, #endif { "115200", B115200 }, #ifdef B153600 { "153600", B153600 }, #endif { "230400", B230400 }, #ifdef B307200 { "307200", B307200 }, #endif #ifdef B460800 { "460800", B460800 } #endif }; static int nspeeds = sizeof speedmap / sizeof speedmap[0]; speed_t cvtspeed(char *str) { struct speedmap *smp = speedmap, *esmp = &speedmap[nspeeds]; while (smp < esmp) { if (strcmp(str, smp->str) == 0) return (smp->val); smp++; } return B0; } int serialopen(char *device, speed_t speed) { int fd; if (cfsetospeed(&tios, speed) < 0) return -1; if ((fd = open(device, O_RDWR)) < 0) return -1; if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) { (void)close(fd); return -1; } return fd; } int serialreadchar(int fd, int timeout) { fd_set fds; struct timeval tv; int n; char ch; tv.tv_sec = timeout; tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(fd, &fds); /* this is a fucking horrible quick hack - fix this */ if ((n = select(fd + 1, &fds, 0, 0, &tv)) < 0) return SERIAL_ERROR; if (n == 0) return SERIAL_TIMEOUT; if ((n = read(fd, &ch, 1)) < 0) return SERIAL_ERROR; if (n == 0) return SERIAL_EOF; return ch; } int serialwrite(int fd, char *buf, int len) { int n; do { n = write(fd, buf, len); if (n < 0) return 1; len -= n; buf += n; } while (len > 0); return 0; } int serialclose(int fd) { return close(fd); } |