Auto commit at 2025-06-12 16:05:24

This commit is contained in:
cxh 2025-06-12 16:05:24 +08:00
parent 50f316a5f2
commit db9f0d75ca
2 changed files with 10 additions and 54 deletions

View File

@ -42,25 +42,13 @@ public:
// 设置接收回调 // 设置接收回调
void setReceiveCallback(ReceiveCallback callback, void *userData = nullptr); void setReceiveCallback(ReceiveCallback callback, void *userData = nullptr);
// 设置硬件过滤规则
bool setFilter(const std::vector<can_filter> &filters);
// 追加一个过滤器
bool addFilter(const can_filter &filter);
// 追加一组过滤器
bool addFilters(const std::vector<can_filter> &filters);
private: private:
void receiveThreadFunc(); void receiveThreadFunc();
bool applyFilters(); // 应用当前filters_
int sockfd = -1; int sockfd = -1;
std::atomic<bool> running{false}; std::atomic<bool> running{false};
std::thread receiveThread; std::thread receiveThread;
ReceiveCallback callback; ReceiveCallback callback;
void *userData = nullptr; void *userData = nullptr;
std::vector<can_filter> filters_; // 当前所有过滤器
}; };
#endif // CAN_DRIVER_H #endif // CAN_DRIVER_H

View File

@ -60,6 +60,13 @@ bool CANDriver::open(const std::string &interface)
return false; return false;
} }
if (VCI_ClearBuffer(deviceType, deviceIndex, channelIndex) != 1)
{
std::cerr << "VCI_ClearBuffer failed" << std::endl;
VCI_CloseDevice(deviceType, deviceIndex);
return false;
}
running = true; running = true;
receiveThread = std::thread(&CANDriver::receiveThreadFunc, this); receiveThread = std::thread(&CANDriver::receiveThreadFunc, this);
return true; return true;
@ -74,6 +81,9 @@ void CANDriver::close()
if (receiveThread.joinable()) if (receiveThread.joinable())
receiveThread.join(); receiveThread.join();
// 先清空缓冲区,防止缓冲区残留数据导致重复接收
VCI_ClearBuffer(deviceType, deviceIndex, channelIndex);
VCI_ResetCAN(deviceType, deviceIndex, channelIndex); VCI_ResetCAN(deviceType, deviceIndex, channelIndex);
VCI_CloseDevice(deviceType, deviceIndex); VCI_CloseDevice(deviceType, deviceIndex);
} }
@ -106,48 +116,6 @@ void CANDriver::setReceiveCallback(ReceiveCallback callback, void *userData)
this->userData = userData; this->userData = userData;
} }
bool CANDriver::setFilter(const std::vector<can_filter> &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<can_filter> &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() void CANDriver::receiveThreadFunc()
{ {
while (running) while (running)