socketCAN发送失败

cwwei20122012 2015-08-13 10:13:30
调用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");
}
...全文
1584 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwwei20122012 2015-08-18
  • 打赏
  • 举报
回复
引用 5 楼 nswcfd 的回复:
send fail之后,errrno是多少?(可以用perorr确认一下) 返回值又是多少?
提示network is down
nswcfd 2015-08-14
  • 打赏
  • 举报
回复
send fail之后,errrno是多少?(可以用perorr确认一下) 返回值又是多少?
  • 打赏
  • 举报
回复
ifconfig -a
cwwei20122012 2015-08-13
  • 打赏
  • 举报
回复

启动不了can0
cwwei20122012 2015-08-13
  • 打赏
  • 举报
回复
查看can: root@OpenWrt:/# root@OpenWrt:/# dmesg |grep can platform 481d0000.d_can: alias fck already exists vcan: Virtual CAN interface driver c_can_platform 481d0000.d_can: c_can_platform device registered (regs=fa1d0000, irq=71) can: controller area network core (rev 20120528 abi 9) can: raw protocol (rev 20120528) can: broadcast manager protocol (rev 20120528 t) can: netlink gateway (rev 20130117) max_hops=1 root@OpenWrt:/#
cwwei20122012 2015-08-13
  • 打赏
  • 举报
回复
引用 3 楼 q3733353520 的回复:
ifconfig -a
没有can0,估计是驱动没弄好了

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧