added a timeout to reading packets from the cape
diff --git a/bbb_cape/src/bbb/uart_reader.cc b/bbb_cape/src/bbb/uart_reader.cc
index 6d65330..f4ebaca 100644
--- a/bbb_cape/src/bbb/uart_reader.cc
+++ b/bbb_cape/src/bbb/uart_reader.cc
@@ -32,10 +32,10 @@
 }  // extern "C"
 
 UartReader::UartReader(int32_t baud_rate)
-    : fd_(open(device, O_RDWR | O_NOCTTY)) {
+    : fd_(open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)) {
   
   if (fd_ < 0) {
-    LOG(FATAL, "open(%s, O_RDWR | O_NOCTTY) failed with %d: %s."
+    LOG(FATAL, "open(%s, O_RDWR | O_NOCTTY | O_NOBLOCK) failed with %d: %s."
                " Did you read my note in bbb/uart_reader.cc?\n",
         device, errno, strerror(errno));
   }
@@ -44,14 +44,30 @@
     LOG(FATAL, "aos_uart_reader_set_tty_options(%d) failed with %d: %s\n",
         fd_, errno, strerror(errno));
   }
+
+  FD_ZERO(&fd_set_);
+  FD_SET(fd_, &fd_set_);
 }
 
 UartReader::~UartReader() {
   if (fd_ > 0) close(fd_);
 }
 
-ssize_t UartReader::ReadBytes(AlignedChar *dest, size_t max_bytes) {
+ssize_t UartReader::ReadBytes(AlignedChar *dest, size_t max_bytes,
+                              const ::aos::time::Time &timeout) {
   do {
+    struct timeval timeout_timeval = timeout.ToTimeval();
+    switch (select(fd_ + 1, &fd_set_, NULL, NULL, &timeout_timeval)) {
+      case 0:
+        return -2;
+      case -1:
+        continue;
+      case 1:
+        break;
+      default:
+        LOG(WARNING, "unknown select return value\n");
+        return -1;
+    }
     ssize_t r = read(fd_, dest, max_bytes);
     if (r != -1) return r;
   } while (errno == EINTR);