mc debug
This commit is contained in:
parent
80711d985c
commit
82c56067de
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user