我看到了一个类似的问题,但它没有回答我的问题
我在我的程序中使用canbus
通信和mask
,这里有一个例子,取自can-utils:
struct can_filter {
canid_t can_id;
canid_t can_mask;
};
struct can_filter *rfilter;
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FILTER, rfilter, numfilter * sizeof(struct can_filter));
/* try to switch the socket into CAN FD mode */
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on));
bind(s[i], (struct sockaddr *) &addr, sizeof(addr))
。.
int ret = select(s[currmax - 1] + 1, &rdfs, NULL, NULL, timeout);
int nbytes = recvmsg(s[i], &msg, 0);
在这个例子中,我设置了mask
和bind
,所以每次我将receive
从socket
发送消息时,它都将使用相同的mask
。
是否可以在bind
之后和receive
之前更改mask
?
示例:
/* try to switch the socket into CAN FD mode */
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on));
bind(s[i], (struct sockaddr *) &addr, sizeof(addr))
。.
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FILTER, rfilter, numfilter * sizeof(struct can_filter));
int ret = select(s[currmax - 1] + 1, &rdfs, NULL, NULL, timeout);
int nbytes = recvmsg(s[i], &msg, 0);
感谢@RamyLebeau的SocketCAN推荐。
来自文件:
带有can_filters(SOCK_RAW(的RAW协议套接字
使用CAN_RAW套接字与通常
已知的对CAN字符设备的访问具有广泛的可比性。为了满足多用户SocketCAN方法提供的新可能性
,在RAW套接字绑定时间设置了一些合理的
默认值:
- 过滤器设置为一个过滤器,用于接收所有内容
- 套接字只接收有效的数据帧(=>没有错误消息帧(
- 已发送CAN帧的环回已启用(请参阅第3.2章(
- 套接字不接收自己发送的帧(在环回模式下(
These default settings may be changed before or after binding the socket
我可以在binding
之前或之后、在socket
之前以及在每个can
消息receive
之前更改mask
。