gpt4 book ai didi

c++ - CAN 套接字读取帧延迟

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:16 33 4
gpt4 key购买 nike

我正在使用如下创建的 CAN linux 套接字:

    ...
sockaddr_can addr;
struct ifreq ifr;

_sock_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);

if (_sock_fd < 0) {
throw(std::bad_exception());
}

strcpy(ifr.ifr_name, "can0");
if (0 != ioctl(_sock_fd, SIOCGIFINDEX, &ifr)) {
throw(std::bad_exception());
}
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;

fcntl(_sock_fd, F_SETFL, O_NONBLOCK);

if (0 != bind(_sock_fd, (struct sockaddr*)&addr, sizeof(addr))) {
throw(std::bad_exception());
}
...

接下来我使用常用​​的read 函数从 CAN 网络读取帧:

int CANSocket::CANRead(canid_t &id, vector<uint8_t> &data) {

size_t size = 0;

while (size < sizeof(struct can_frame)) {
size += read(_sock_fd, &_msg, sizeof(struct can_frame));
}

id = _msg.can_id;

data.clear();
for (int i = 0; i < _msg.can_dlc; ++i) {
data.push_back(_msg.data[i]);
}

return data.size();
}

我的问题是,当我调用我的 CANRead 函数时,它返回的帧比我通过 candump 实用程序获得的实际帧早大约 100 帧。

我在读取帧之间使用 5 毫秒的 sleep 时间,服务器以接近每秒 25 帧的速度发送帧。

例如:当我通过 candump 实用程序列出读取帧时,我得到例如框架

101
102
103
104
...
200

但是我的程序同时运行会返回类似的帧

1
1
1
2
2
2
...
99

我在帧读取和套接字配置中做错了什么,所以它读取了带有重复的延迟帧?

最佳答案

问题是由套接字读取缓冲引起的。将缓冲区大小设置为已解决的小问题:

    ...
int bufsize = 128;
if (0 != setsockopt(_sock_fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize))) {
throw(std::bad_exception());
}
...

关于c++ - CAN 套接字读取帧延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58318231/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com