# HG changeset patch # User Mychaela Falconia # Date 1584078800 0 # Node ID 2bd27d940023504b3a425707b118171b3fd1ca4f # Parent 917e05f03ad2a64191b6c1b7a2cb09bb931daabd fluid-mnf/serial.c: serial_recv() implemented diff -r 917e05f03ad2 -r 2bd27d940023 fluid-mnf/serial.c --- a/fluid-mnf/serial.c Fri Mar 13 05:40:23 2020 +0000 +++ b/fluid-mnf/serial.c Fri Mar 13 05:53:20 2020 +0000 @@ -29,11 +29,14 @@ #include #include #include +#include #include #include #include #include +extern int errno; + /****************************************************************************** * Linux Driver @@ -208,7 +211,29 @@ int serial_recv(char *buf, int size, int timeout) { - /* to be filled */ + fd_set fds; + struct timeval tv; + int cc; + + for (;;) { + FD_ZERO(&fds); + FD_SET(target_fd, &fds); + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + cc = select(target_fd+1, &fds, NULL, NULL, &tv); + if (cc < 0) { + if (errno == EINTR) + continue; + return E_OS + E_UART_DRV_RECV; + } + break; + } + if (cc == 0) + return cc; + cc = read(target_fd, buf, size); + if (cc <= 0) + cc = E_OS + E_UART_DRV_RECV; + return cc; }