From db9f0d75ca53a7fbd808ef97af8ae0452341de72 Mon Sep 17 00:00:00 2001 From: cxh Date: Thu, 12 Jun 2025 16:05:24 +0800 Subject: [PATCH] Auto commit at 2025-06-12 16:05:24 --- src/mc/include/mc/can_driver.h | 12 -------- src/mc/src/can_driver.cpp | 52 +++++++--------------------------- 2 files changed, 10 insertions(+), 54 deletions(-) diff --git a/src/mc/include/mc/can_driver.h b/src/mc/include/mc/can_driver.h index db7af0e..1a9f1a0 100644 --- a/src/mc/include/mc/can_driver.h +++ b/src/mc/include/mc/can_driver.h @@ -42,25 +42,13 @@ public: // 设置接收回调 void setReceiveCallback(ReceiveCallback callback, void *userData = nullptr); - // 设置硬件过滤规则 - bool setFilter(const std::vector &filters); - - // 追加一个过滤器 - bool addFilter(const can_filter &filter); - - // 追加一组过滤器 - bool addFilters(const std::vector &filters); - private: void receiveThreadFunc(); - bool applyFilters(); // 应用当前filters_ - int sockfd = -1; std::atomic running{false}; std::thread receiveThread; ReceiveCallback callback; void *userData = nullptr; - std::vector filters_; // 当前所有过滤器 }; #endif // CAN_DRIVER_H diff --git a/src/mc/src/can_driver.cpp b/src/mc/src/can_driver.cpp index 219ed83..67540ef 100644 --- a/src/mc/src/can_driver.cpp +++ b/src/mc/src/can_driver.cpp @@ -60,6 +60,13 @@ bool CANDriver::open(const std::string &interface) return false; } + if (VCI_ClearBuffer(deviceType, deviceIndex, channelIndex) != 1) + { + std::cerr << "VCI_ClearBuffer failed" << std::endl; + VCI_CloseDevice(deviceType, deviceIndex); + return false; + } + running = true; receiveThread = std::thread(&CANDriver::receiveThreadFunc, this); return true; @@ -74,6 +81,9 @@ void CANDriver::close() if (receiveThread.joinable()) receiveThread.join(); + // 先清空缓冲区,防止缓冲区残留数据导致重复接收 + VCI_ClearBuffer(deviceType, deviceIndex, channelIndex); + VCI_ResetCAN(deviceType, deviceIndex, channelIndex); VCI_CloseDevice(deviceType, deviceIndex); } @@ -106,48 +116,6 @@ void CANDriver::setReceiveCallback(ReceiveCallback callback, void *userData) this->userData = userData; } -bool CANDriver::setFilter(const std::vector &filters) -{ - if (!running) - return false; - - filters_ = filters; - return applyFilters(); -} - -bool CANDriver::addFilter(const can_filter &filter) -{ - filters_.push_back(filter); - return applyFilters(); -} - -bool CANDriver::addFilters(const std::vector &filters) -{ - filters_.insert(filters_.end(), filters.begin(), filters.end()); - return applyFilters(); -} - -bool CANDriver::applyFilters() -{ - if (!running) - return false; - - if (filters_.empty()) - { - setsockopt(sockfd, SOL_CAN_RAW, CAN_RAW_FILTER, nullptr, 0); - return true; - } - - if (setsockopt(sockfd, SOL_CAN_RAW, CAN_RAW_FILTER, - filters_.data(), filters_.size() * sizeof(can_filter)) < 0) - { - perror("setsockopt"); - return false; - } - - return true; -} - void CANDriver::receiveThreadFunc() { while (running)