2386|0

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

跪求SAM 9x25 can总线的一些问题的指教 [复制链接]

如题目说的,该型号有2路can总线,我按照配套例程,只想使用can1,不想使用can0 ,因为使用can0 后,debug串口不能使用,也就无法使用板子的文件系统和终端。代码以给出截图,我只是将can0 改为can1 。但是显示出类似没有can1这个设备的问题提示,打开can1 失败。求指教。
  1. nt main(char *argv[], int argc)
  2. {
  3.         int s,res;
  4.         pthread_t id;
  5.         unsigned long nbytes;
  6.         struct sockaddr_can addr;
  7.         struct ifreq ifr;
  8.         struct can_frame frame;
  9.         char senddata[80] = { "test" };
  10.         int  len;
  11.         int  index;

  12.         s = socket(PF_CAN,SOCK_RAW,CAN_RAW); // Create a socket with PF_CAN family, SOCK_RAW and CAN_RAW protocol

  13.         strcpy((char *)(ifr.ifr_name),"can0"); // Use can0
  14.         res = ioctl(s,SIOCGIFINDEX,&ifr); // Control device and get information
  15.         printf("ioctl:%d\n", res);
  16.         printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);

  17.         int loopback = 0; /* 0 = disabled, 1 = enabled (default) */
  18.     setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback)); // Setting lookback options
  19.         printf("set can0 sock loopback unable:%d\n", res);

  20.         int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */
  21.     res = setsockopt(s, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, // Setting receiver own massages options
  22.                &recv_own_msgs, sizeof(recv_own_msgs));
  23.         printf("set can0 do not receiver own massage:%d\n", res);

  24.         addr.can_family = AF_CAN; // Use AF_CAN protocol family
  25.         addr.can_ifindex = ifr.ifr_ifindex;  // frame index
  26.         res = bind(s,(struct sockaddr*)&addr,sizeof(addr)); // Binding sock
  27.         printf("bind can0 sock:%d\n", res);

  28.         /* Create a tread for can1 receiver and send message */
  29.         //        pthread_create(&id, NULL, (void*)can1_thread, NULL);

  30.         frame.can_id = 0x123;
  31.         len = strlen(senddata) - 1;
  32.        
  33.         while (1) {
  34.                 //                memset(senddata, 0, sizeof(senddata));
  35.                 /* Get input from stdin */
  36.                 //                fgets(senddata, sizeof(senddata), stdin);
  37.                 /*        nbytes = recvfrom(s, &frame, sizeof(struct can_frame), 0, (struct sockaddr *)&addr, 16);
  38.                 if (nbytes != -1) {
  39.                         printf("Recv message: %d  %s\n", nbytes, frame.data);
  40.                         strncpy(frame.data, senddata, 5);
  41.                         frame.can_dlc = strlen(frame.data);
  42.                         nbytes = sendto(s, &frame, sizeof(struct can_frame), 0, (struct sockaddr *)&addr, sizeof(addr));
  43.                         if (nbytes != -1) {
  44.                                 printf("Send success:%d  %s\n", nbytes, senddata);
  45.                         }
  46.                 }
  47.        

  48.                 */

  49.                 strncpy(frame.data, senddata, 5);
  50.                 frame.can_dlc = strlen(frame.data);
  51.                 nbytes = sendto(s, &frame, sizeof(struct can_frame), 0, (struct sockaddr*)&addr, sizeof(addr));
  52.                 if (nbytes != -1) {
  53.                         printf("Send success: %d  %s\n", nbytes, senddata);
  54.                         usleep(500000);
  55.                         nbytes = recvfrom(s, &frame, sizeof(struct can_frame), 0, (struct sockaddr *)&addr, &len);
  56.                         if (nbytes != -1) {
  57.                                 printf("Recv message: %d  %s\n", nbytes, frame.data);
  58.                         }
  59.                 }

  60.                 /* Send 8 bytes each time */
  61.                 /*for (index = 0; index < len / 7; ++index) {
  62.                         memset(frame.data, 0, 8);
  63.                         strncpy(frame.data, &senddata[index * 7], 7);
  64.                         frame.can_dlc = strlen(frame.data); // Set data length
  65.                        
  66.                         nbytes = sendto(s, &frame, sizeof(struct can_frame), 0, (struct sockaddr*)&addr, sizeof(addr));
  67.                         if (nbytes == -1) {
  68.                                 perror("send error");
  69.                         } else {
  70.                                 printf("send %d bytes to can0: %s\n", frame.can_dlc, frame.data);
  71.                                 /* receiver feedback message */
  72.                 /*                nbytes = recvfrom(s,&frame,sizeof(struct can_frame),0,(struct sockaddr *)&addr,&len);
  73.                
  74.                                 if (nbytes == -1) {
  75.                                         perror("recv error");
  76.                                 } else {
  77.                                         printf("recv %d bytes from can0: %s\n", frame.can_dlc, frame.data);
  78.                                 }
  79.                         }                               
  80.                 }
  81.                 if (len % 7 != 0) {
  82.                         memset(frame.data, 0, 8);
  83.                         strncpy(frame.data, &senddata[index * 7], len % 7);
  84.                         frame.can_dlc = strlen(frame.data);
  85.                         nbytes = sendto(s, &frame, sizeof(struct can_frame), 0, (struct sockaddr*)&addr, sizeof(addr));
  86.                         if (nbytes == -1) {
  87.                                 perror("send error");
  88.                         } else {
  89.                                 printf("send %d bytes to can0: %s\n", nbytes, frame.data);
  90.                                 /* receiver feedback message */
  91.                 /*                nbytes = recvfrom(s,&frame,sizeof(struct can_frame),0,(struct sockaddr *)&addr,&len);
  92.                
  93.                                 if (nbytes == -1) {
  94.                                         perror("recv error");
  95.                                 } else {
  96.                                         printf("recv %d bytes from can0: %s\n", frame.can_dlc, frame.data);
  97.                                 }
  98.                         }
  99.                         }*/
  100.         }

  101.         return 0;
  102. }
复制代码
此帖出自ARM技术论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表