diff --git a/src/base/mc/src/can_driver.cpp b/src/base/mc/src/can_driver.cpp index 3b64fd1..2a245b8 100644 --- a/src/base/mc/src/can_driver.cpp +++ b/src/base/mc/src/can_driver.cpp @@ -50,6 +50,10 @@ bool CANDriver::open(const std::string& interface) return false; } + // 增大接收缓冲区,防止高流量时丢帧 + int buf_size = 1024 * 1024; // 1MB + setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(buf_size)); + // 设置为非阻塞 int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); @@ -159,18 +163,28 @@ void CANDriver::receiveThreadFunc() continue; } - ssize_t nbytes = read(sockfd, &raw_frame, sizeof(raw_frame)); - if (nbytes == sizeof(raw_frame) && callback) + // 读取所有缓冲的帧,避免帧堆积丢失 + while (running) { - CANFrame frame; - frame.id = raw_frame.can_id & CAN_EFF_MASK; - frame.ext = !!(raw_frame.can_id & CAN_EFF_FLAG); - frame.rtr = !!(raw_frame.can_id & CAN_RTR_FLAG); - frame.dlc = raw_frame.can_dlc; - memcpy(frame.data, raw_frame.data, raw_frame.can_dlc); + ssize_t nbytes = read(sockfd, &raw_frame, sizeof(raw_frame)); + if (nbytes != sizeof(raw_frame)) + { + // 没有更多数据或出错,退出内层循环 + break; + } - // 调用回调函数,处理接收到的帧 - callback(frame, userData); + if (callback) + { + CANFrame frame; + frame.id = raw_frame.can_id & CAN_EFF_MASK; + frame.ext = !!(raw_frame.can_id & CAN_EFF_FLAG); + frame.rtr = !!(raw_frame.can_id & CAN_RTR_FLAG); + frame.dlc = raw_frame.can_dlc; + memcpy(frame.data, raw_frame.data, raw_frame.can_dlc); + + // 调用回调函数,处理接收到的帧 + callback(frame, userData); + } } } } \ No newline at end of file