From e5ecb2e4412c081f89e587c17387dc10689ad22a Mon Sep 17 00:00:00 2001 From: cxh Date: Tue, 22 Jul 2025 08:39:28 +0800 Subject: [PATCH] Auto commit at 2025-07-22 08:39:28 --- src/mc/src/can_driver.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/mc/src/can_driver.cpp b/src/mc/src/can_driver.cpp index 7204296..c131391 100644 --- a/src/mc/src/can_driver.cpp +++ b/src/mc/src/can_driver.cpp @@ -3,8 +3,9 @@ #include #include #include -#include // 用于 fcntl -#include // 用于 close 和 read +#include +#include +#include CANDriver::CANDriver() = default; @@ -178,22 +179,27 @@ bool CANDriver::applyFilters() void CANDriver::receiveThreadFunc() { -#ifdef _WIN32 - // Windows接收实现 -#else struct can_frame raw_frame; + struct pollfd fds; + fds.fd = sockfd; + fds.events = POLLIN; + while (running) { - // 在非阻塞模式下读取数据 - ssize_t nbytes = read(sockfd, &raw_frame, sizeof(raw_frame)); - if (nbytes < 0) + int ret = poll(&fds, 1, 100); // 等待最多100ms + + if (ret < 0) { - if (errno != EAGAIN) // 非阻塞错误,忽略 - { - perror("read"); - } - continue; // 没有数据时继续循环 + perror("poll"); + continue; } + else if (ret == 0) + { + // 超时无数据,可继续 + continue; + } + + ssize_t nbytes = read(sockfd, &raw_frame, sizeof(raw_frame)); if (nbytes == sizeof(raw_frame) && callback) { @@ -208,5 +214,4 @@ void CANDriver::receiveThreadFunc() callback(frame, userData); } } -#endif }