CAN 套接字读取帧延迟
CAN socket read with frames late
我正在使用如下创建的 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
函数时,它 returns 帧比我通过 candump
实用程序获得的实际帧早大约 100 帧。
我在读取帧之间使用 5ms 睡眠,服务器发送帧的速度接近每秒 25 帧。
例如:当我通过 candump
实用程序列出阅读框架时,我得到例如帧
101
102
103
104
...
200
但我的程序 运行 同时 returns 帧像
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());
}
...
我正在使用如下创建的 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
函数时,它 returns 帧比我通过 candump
实用程序获得的实际帧早大约 100 帧。
我在读取帧之间使用 5ms 睡眠,服务器发送帧的速度接近每秒 25 帧。
例如:当我通过 candump
实用程序列出阅读框架时,我得到例如帧
101
102
103
104
...
200
但我的程序 运行 同时 returns 帧像
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());
}
...