diff --git a/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp b/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp index 8df5c21b5e..b16950c009 100644 --- a/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp +++ b/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp @@ -200,7 +200,11 @@ uavcan::int16_t CanIface::send(const uavcan::CanFrame &frame, uavcan::MonotonicT return 1; } else { - return res; + if (errno == ENOBUFS || errno == EAGAIN || errno == EWOULDBLOCK) { + return 0; // Transmit queue is full, retry + } + + return -1; } } @@ -210,7 +214,11 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic int32_t result = recvmsg(_fd, &_recv_msg, MSG_DONTWAIT); if (result < 0) { - return result; + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return 0; + } + + return -1; } /* Copy SocketCAN frame to CanardFrame */ @@ -220,7 +228,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic out_frame.id = recv_frame->can_id; if (recv_frame->len > CANFD_MAX_DLEN) { - return -EFAULT; + return -1; } out_frame.dlc = recv_frame->len; @@ -231,7 +239,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic out_frame.id = recv_frame->can_id; if (recv_frame->can_dlc > CAN_MAX_DLEN) { - return -EFAULT; + return -1; } out_frame.dlc = recv_frame->can_dlc; @@ -245,7 +253,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic out_ts_monotonic = uavcan::MonotonicTime::fromUSec(tv->tv_sec * 1000000ULL + tv->tv_usec); } - return result; + return 1; }