socketCAN发送失败
调用init()显示:
ioctl:0
can0 can_ifindex =7
set can0 sock loopback unable:0
set can0 do not receiver own massage:0
bind can0 sock:0
调用send()显示:
sending--->id:11, dlc:1, data:20 (id由参数传递)
send fail!
发送失败,找不原因,问过做板的工程师说CAN驱动是好的,只需把它当做网络设备操作。
----------------------------------------代码----------------------------------------
void CanComm::init(void)
{
int ret;
struct sockaddr_can addr;
struct ifreq ifr;
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if(s == -1)
{
_DEBUG printf("invalid socket\n");
exit(1);
}
strcpy(ifr.ifr_name, "can0" );
ret = ioctl(s, SIOCGIFINDEX, &ifr);
_DEBUG printf("ioctl:%d\n", ret);
_DEBUG printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
int loopback = 0; /* 0 = disabled, 1 = enabled (default) */
ret = setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback)); // Setting lookback options
_DEBUG printf("set can0 sock loopback unable:%d\n", ret);
int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */
ret = setsockopt(s, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &recv_own_msgs, sizeof(recv_own_msgs));
printf("set can0 do not receiver own massage:%d\n", ret);
bind(s, (struct sockaddr *)&addr, sizeof(addr));
_DEBUG printf("bind can0 sock:%d\n", ret);
}
void CanComm::send(void)
{
struct can_frame frame;
frame.can_id = canid;
frame.can_dlc = 1;
frame.data[0] = 20;
_DEBUG printf("sending--->id:%d, dlc:%d, data:%d\n", frame.can_id,frame.can_dlc,frame.data[0]);
int nbytes = write(s, &frame, sizeof(frame));
if(nbytes != sizeof(frame))
_DEBUG printf("send fail!\n");
}