[讨论] 跪求SAM 9x25 can总线的一些问题的指教

liu20130172   2013-11-21 10:50 楼主
如题目说的,该型号有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. }

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复