This commit is contained in:
Alvin-lyq 2026-05-08 10:27:52 +08:00
parent 80711d985c
commit 82c56067de

View File

@ -50,6 +50,10 @@ bool CANDriver::open(const std::string& interface)
return false; 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); int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
@ -159,18 +163,28 @@ void CANDriver::receiveThreadFunc()
continue; continue;
} }
ssize_t nbytes = read(sockfd, &raw_frame, sizeof(raw_frame)); // 读取所有缓冲的帧,避免帧堆积丢失
if (nbytes == sizeof(raw_frame) && callback) while (running)
{ {
CANFrame frame; ssize_t nbytes = read(sockfd, &raw_frame, sizeof(raw_frame));
frame.id = raw_frame.can_id & CAN_EFF_MASK; if (nbytes != sizeof(raw_frame))
frame.ext = !!(raw_frame.can_id & CAN_EFF_FLAG); {
frame.rtr = !!(raw_frame.can_id & CAN_RTR_FLAG); // 没有更多数据或出错,退出内层循环
frame.dlc = raw_frame.can_dlc; break;
memcpy(frame.data, raw_frame.data, raw_frame.can_dlc); }
// 调用回调函数,处理接收到的帧 if (callback)
callback(frame, userData); {
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);
}
} }
} }
} }