创龙tl-can-rw例程问题 - AM57x - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3159|回复: 1

[已解决] 创龙tl-can-rw例程问题

[复制链接]

44

主题

368

帖子

2894

积分

创龙

Rank: 8Rank: 8

积分
2894
发表于 2020-5-21 17:43:49 | 显示全部楼层 |阅读模式
        我公司新购买的AM335X开发板,我这边进行CAN测试的时候,发现一个后续项目运行中可能存在问题的地方。
        我如果不接CAN设备,直接CAN往外发送数据,最多发送366帧数据就会阻塞程序
1.   我自己的程序代码如下:

int main()
{
        int s;
        unsigned  int nbytes;
        struct sockaddr_can addr;
        struct ifreq ifr;
        struct can_frame sendf, recvf;
        int flag_num = 0;
        char message[1024] = {0};
        unsigned int len;
        int ret = 0,flag = 0;
        unsigned int i = 0;
        int j=0;
        unsigned char qq[8]={11, 22 ,33 ,44 ,55,66, 77 ,88};


        system(down);
        system(command);
        usleep(50);
        system(up);
        usleep(50);




        s = socket(PF_CAN,SOCK_RAW,CAN_RAW);
        strcpy((char *)(ifr.ifr_name),"can0");
        ioctl(s,SIOCGIFINDEX,&ifr);
        printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);


        addr.can_family = AF_CAN;
        addr.can_ifindex = ifr.ifr_ifindex;
        ret = bind(s,(struct sockaddr*)&addr,sizeof(addr));
       
        if(ret < 0){
                printf("in bind error \n");
                exit(1);
        }
        while(1)
        {
                memset(&sendf, 0, sizeof(struct can_frame));
                sendf.can_id = 0x123;
                memcpy(sendf.data,qq,8);
               
                sendf.can_dlc = 8;
                nbytes = sendto(s,&sendf,sizeof(struct can_frame),0,(struct sockaddr*)&addr,sizeof(addr));
                printf("can dlc: %d\n",sendf.can_dlc);


                for(j=0;j<sendf.can_dlc;j++){
                        printf("%d ",sendf.data[j]);
                }
                printf("\n");
                printf("can data %d sended\n",i++);
                usleep(100000);               
        }
        system(down);
        return 0;
}


       程序测试截图如下:





2.    使用创龙tl-can-rw_AM335x例程的写入500帧数据的打印信息如下图:




    这二者得到的数字是接近的,一个是366,一个是365。
   
    可能导致的问题:
        后续程序在运行的过程中,如果连接的CAN设备断掉了,我开发板CAN程序还在一直运行的话(CAN一直往外发送数据),就会导致我板子整个程序处于阻塞状态。
    解决办法:
        1. 在CAN发送数据之前,先检测以下CAN总线上有没有设备,有设备的话,CAN再发送数据
        2. CAN有自己的收发寄存器,大小应该是365帧数据,应用程序有没有办法先查询一下寄存器是否满了,同时清空这个寄存器,然后我程序CAN继续向外发送数据。
    贵公司能否提供后两种解决方案的参考例程或者给一些相应的想法提示,您那边有更好的别的解决方案也可以提供。
            

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

44

主题

368

帖子

2894

积分

创龙

Rank: 8Rank: 8

积分
2894
 楼主| 发表于 2020-5-21 17:55:11 | 显示全部楼层
        建议发送数据前用selet判断socket是否可写。 具体使用方法可以参考 man select
清除缓冲区内容未找到相关API,可以考虑重新初始化socket


85 struct timeval tv;
86 tv.tv_sec = 1;
87 tv.tv_usec = 0;
88 fd_set writeset;
89 FD_ZERO(&writeset);
90 FD_SET(socket, &writeset);
91
92 int retval = select(socket + 1, NULL, &writeset, NULL, &tv);
93 if (retval == -1)
94 perror("select()");
95 else if (retval)
96 printf("Data is available now.\n");
97 else {
98 printf("No data within one seconds.\n");
99 }
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-3-29 22:41 , Processed in 0.036107 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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