本帖最后由 yayaer12 于 2021-9-27 11:54 编辑
最近在做linux socketcan,已经弄了好些日子,但是还没搞明白。 问题: 硬件平台:Zynq 7000 ,搭载Ubuntu12.04,socketCAN,500kbps。 /******************************************************************************/ 进行socketcan通信开发,在官方提供的例程和驱动下,CAN的标准帧收发测试正常。 但是进行扩展帧收发测试时,发现只有发送正常,接收时ID和DLC正常,数据却都是0。  
图1:上位机模拟下发给Zynq7000 扩展帧报文
图2:芯片内部接收ID、DLC正常,data全是0,这块只打印出来了第一个data[0],其它7个数据也全是0. - 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){
- RecvBuffer[0][0][0]=frame.can_id ;
- RecvBuffer[0][0][1]=frame.can_dlc;
- RecvBuffer[0][0][2]=frame.data[0];
- RecvBuffer[0][0][3]=frame.data[1];
- RecvBuffer[0][0][4]=frame.data[2];
- RecvBuffer[0][0][5]=frame.data[0];
- RecvBuffer[0][0][6]=frame.data[4];
- RecvBuffer[0][0][7]=frame.data[5];
- RecvBuffer[0][0][8]=frame.data[6];
- RecvBuffer[0][0][9]=frame.data[7]; //show message
- if (nbytes > 0) {
- printf("ID=0x%X DLC=%d data[0][0][2]=0x%X\n", RecvBuffer[0][0][0],
- RecvBuffer[0][0][1],RecvBuffer[0][0][2]);
- }
- }
- /******************************************************************************/
- void SendCAN(void){
-
- frame.can_id = CAN_EFF_FLAG | 0x1C2;
- frame.can_dlc = 8;
- frame.data[0] = 0xA8;
- frame.data[1] = 0xA7;
- frame.data[2] = 0xA6;
- frame.data[3] = 0xA5;
- frame.data[4] = 0xA4;
- frame.data[5] = 0xA3;
- frame.data[6] = 0xA2;
- frame.data[7] = 0xA1;
- nbytes = write(s, &frame, sizeof(frame)); //send message
- if (nbytes != sizeof(frame)) {
- printf("Send Error frame\n!");
- } printf("Send Back id[0]=0x%X\n",frame.can_id);
- }
- /******************************************************************************/
- s = socket(PF_CAN, SOCK_RAW, CAN_RAW); //create socket
- printf("can_s is %d\n",s); strcpy(ifr.ifr_name, "can0" );
- ioctl(s, SIOCGIFINDEX, &ifr); //select dev
- addr.can_family = AF_CAN;
- addr.can_ifindex = ifr.ifr_ifindex; printf("ifr_ifindex is %d\n",addr.can_ifindex );
- bind(s, (struct sockaddr *)&addr, sizeof(addr)); //bind
- frame.can_id |= CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_EFF_MASK;
- while(1)
- {
- SendCAN();//send the command
- nbytes = read(s, &frame, sizeof(frame)); //recv protocol
- printf("can_r_nbytes is %d\n",nbytes);
- printf("frame.can_id is 0x%X\n",frame.can_id & CAN_EFF_MASK);
- if (nbytes < 0) {
- perror("can raw socket read");
- return -2;
- }
- /* paranoid check ... */
- if (nbytes < sizeof(struct can_frame)) {
- fprintf(stderr, "read: incomplete CAN frame\n");
- return -3;
- }
- //for test
- RecvCAN();//recv the data and save the data to a buffer
- }
复制代码
|