OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7095|回复: 2

socketcan扩展帧接收数据异常

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2021-9-27
在线时间
1 小时
发表于 2021-9-27 11:48:15 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 yayaer12 于 2021-9-27 11:54 编辑

最近在做linux socketcan,已经弄了好些日子,但是还没搞明白。

问题:

硬件平台:Zynq 7000 ,搭载Ubuntu12.04,socketCAN,500kbps。

/******************************************************************************/

进行socketcan通信开发,在官方提供的例程和驱动下,CAN的标准帧收发测试正常。

但是进行扩展帧收发测试时,发现只有发送正常,接收时ID和DLC正常,数据却都是0。

图1:上位机模拟下发给Zynq7000 扩展帧报文

recv.png

图2:芯片内部接收ID、DLC正常,data全是0,这块只打印出来了第一个data[0],其它7个数据也全是0.

  1. int RecvBuffer[16][4][10]={0,0,0};//16:means 16 nodes;4:different PFs;10:recv data,include can_id、can_dlcstruct can_frame frame;int count=0;int nbytes;int s;void RecvCAN(void){
  2.         RecvBuffer[0][0][0]=frame.can_id ;
  3.         RecvBuffer[0][0][1]=frame.can_dlc;
  4.         RecvBuffer[0][0][2]=frame.data[0];
  5.         RecvBuffer[0][0][3]=frame.data[1];
  6.         RecvBuffer[0][0][4]=frame.data[2];
  7.         RecvBuffer[0][0][5]=frame.data[0];
  8.         RecvBuffer[0][0][6]=frame.data[4];
  9.         RecvBuffer[0][0][7]=frame.data[5];
  10.         RecvBuffer[0][0][8]=frame.data[6];
  11.         RecvBuffer[0][0][9]=frame.data[7];        //show message
  12.         if (nbytes > 0) {            
  13.          printf("ID=0x%X DLC=%d data[0][0][2]=0x%X\n", RecvBuffer[0][0][0],
  14.                      RecvBuffer[0][0][1],RecvBuffer[0][0][2]);
  15.         }
  16. }
  17. /******************************************************************************/
  18. void SendCAN(void){
  19.    
  20.     frame.can_id = CAN_EFF_FLAG | 0x1C2;
  21.     frame.can_dlc = 8;
  22.     frame.data[0] = 0xA8;
  23.     frame.data[1] = 0xA7;
  24.     frame.data[2] = 0xA6;
  25.     frame.data[3] = 0xA5;
  26.     frame.data[4] = 0xA4;
  27.     frame.data[5] = 0xA3;
  28.     frame.data[6] = 0xA2;
  29.     frame.data[7] = 0xA1;

  30.     nbytes = write(s, &frame, sizeof(frame));  //send message
  31.     if (nbytes != sizeof(frame)) {      
  32.      printf("Send Error frame\n!");
  33.     }    printf("Send Back id[0]=0x%X\n",frame.can_id);
  34. }
  35. /******************************************************************************/
  36. s = socket(PF_CAN, SOCK_RAW, CAN_RAW);                  //create socket
  37.     printf("can_s is %d\n",s);    strcpy(ifr.ifr_name, "can0" );
  38.     ioctl(s, SIOCGIFINDEX, &ifr);                           //select dev
  39.     addr.can_family = AF_CAN;
  40.     addr.can_ifindex = ifr.ifr_ifindex;    printf("ifr_ifindex is %d\n",addr.can_ifindex );
  41.     bind(s, (struct sockaddr *)&addr, sizeof(addr));        //bind
  42.     frame.can_id |= CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_EFF_MASK;   
  43.     while(1)
  44.     {
  45.         SendCAN();//send the command

  46.         nbytes = read(s, &frame, sizeof(frame));   //recv protocol
  47.         printf("can_r_nbytes is %d\n",nbytes);      
  48.          printf("frame.can_id is 0x%X\n",frame.can_id & CAN_EFF_MASK);      
  49.           if (nbytes < 0) {
  50.                 perror("can raw socket read");              
  51.                   return -2;
  52.         }      
  53.          /* paranoid check ... */
  54.         if (nbytes < sizeof(struct can_frame)) {               
  55.         fprintf(stderr, "read: incomplete CAN frame\n");               
  56.          return -3;
  57.         }      
  58.          //for test
  59.         RecvCAN();//recv the data and save the data to a buffer
  60.     }
复制代码




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-9-27 15:43:15 | 显示全部楼层
帮顶    。。。请选择正确的版区。。。。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-8-6
在线时间
0 小时
发表于 2022-8-6 17:18:44 | 显示全部楼层
你好,我最近也在开发socketcan,有问题一起交流。加我的微信/QQ。。2405369646
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-26 18:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表