社区导航

 

搜索
查看: 3831|回复: 6

[求助] 请教 UCOSIII下CAN总线的接收问题

[复制链接]

209

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-11-29 10:19 | 显示全部楼层 |阅读模式
小弟目前再弄UCOSIII,在CAN总线接收上面遇到了难题,肯定各位帮帮忙,指点指点迷津!具体现象是,连续下发4个不同的报文,任务处理函数中串口打印出的数据只有第1条和第4条,并且第四条打印了3次,总的报文数是对的,但就是第2、3条报文没有,第4条报文多了两次。下面是主要的两个函数


在CAN接收中断中:
extern OS_TCB        Can1TaskTCB;
extern OS_TCB        Can2TaskTCB;
extern OS_FLAG_GRP        EVENTFLAH_GRP;

void CAN1_RX0_IRQHandler(void)
{
        OS_ERR   err;        
        static uint8_t i=0,j=0;
        static uint8_t *can1buf[8];
        
        OSIntEnter();
        can1buf[j]=mymalloc(SRAMIN,8);

        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
        //for(i=0;i<8;i++)
        //{
                can1buf[j] = (uint8_t*)RxMessage.Data;
        //}
        
        /* 发布任务消息到任务 AppTaskUsart */
//                OSTaskQPost ((OS_TCB      *)&Can1TaskTCB,      //目标任务的控制块
//                             (void        *)can1buf[j],             //消息内容的首地址
//                             (OS_MSG_SIZE  )8,                     //消息长度
//                             (OS_OPT       )OS_OPT_POST_FIFO,      //发布到任务消息队列的入口端
//                             (OS_ERR      *)&err);                 //返回错误类型
               
        OSQPost ((OS_Q*                )&CAN1_QUEUE,
                 (void*                )can1buf[j],
                 (OS_MSG_SIZE   )8,
                 (OS_OPT        )OS_OPT_POST_FIFO,
                 (OS_ERR*        )&err);
        j++;
                if(j==8)
                        j=0;
        OSIntExit();            //退出中断
}


在CAN任务处理控制块中
void can1_task(void *p_arg)
{
        OS_ERR err;
        uint8_t *p,i;
        OS_MSG_SIZE        size;
        p_arg = p_arg;
        while(1)
        {
//                p = OSTaskQPend ((OS_TICK        )0,                    //无期限等待
//                                 (OS_OPT         )OS_OPT_PEND_BLOCKING, //没有消息就阻塞任务
//                                 (OS_MSG_SIZE   *)&size,            //返回消息长度
//                                 (CPU_TS        *)0,                    //返回消息被发布的时间戳
//                                 (OS_ERR        *)&err);                //返回错误类型
                p = OSQPend ((OS_Q*                )&CAN1_QUEUE,
                             (OS_TICK                )0,
                             (OS_OPT                 )OS_OPT_PEND_BLOCKING,
                             (OS_MSG_SIZE*        )&size,
                             (CPU_TS*                )0,
                             (OS_ERR*                )&err);
                for(i=0;i<8;i++)
                {
                        printf("%c",*p++);
                }
                myfree(SRAMIN,p);        //释放内存
                GPIO_ResetBits(GPIOC,GPIO_Pin_1);
                OSTimeDlyHMSM ((CPU_INT16U   )0,
                               (CPU_INT16U   )0,
                               (CPU_INT16U   )1,
                               (CPU_INT32U   )0,
                               (OS_OPT       )OS_OPT_TIME_HMSM_NON_STRICT,
                               (OS_ERR*             )&err);
        }
}
此帖出自uCOS/uCGUI论坛
是金子总会发光1

回复

使用道具 举报

209

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2016-11-29 10:19 | 显示全部楼层
补充一下,使用任务内消息和消息列表,现象都一样

回复

使用道具 举报

4193

TA的帖子

9

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2016-11-29 18:49 | 显示全部楼层
UCOSIII还没开始玩,没你玩的那么高端。我建议你还是先看看在裸机下,你的can总线收发通不通? 我用到的是can的分析仪

点评

裸机是没有问题的。常用产品,用了好久了,  详情 回复 发表于 2016-11-30 10:23

回复

使用道具 举报

209

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2016-11-30 10:23 | 显示全部楼层
huaiqiao 发表于 2016-11-29 18:49
UCOSIII还没开始玩,没你玩的那么高端。我建议你还是先看看在裸机下,你的can总线收发通不通? 我用到的是c ...

裸机是没有问题的。常用产品,用了好久了,

点评

没玩过iii,所以帮不到你。但是如果裸机没有问题,估计你的问题还是出在iii的程序这里吧  详情 回复 发表于 2016-11-30 11:40
是金子总会发光1

回复

使用道具 举报

4193

TA的帖子

9

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2016-11-30 11:40 | 显示全部楼层
李俊锋 发表于 2016-11-30 10:23
裸机是没有问题的。常用产品,用了好久了,

没玩过iii,所以帮不到你。但是如果裸机没有问题,估计你的问题还是出在iii的程序这里吧

回复

使用道具 举报

120

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-1-7 19:40 | 显示全部楼层
是不是CAN数据发送慢一点就是正确的?

回复

使用道具 举报

999

TA的帖子

1

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-1-7 21:54 | 显示全部楼层
OSTimeDlyHMSM ((CPU_INT16U   )0,
                               (CPU_INT16U   )0,
                               (CPU_INT16U   )1,
                               (CPU_INT32U   )0,
                               (OS_OPT       )OS_OPT_TIME_HMSM_NON_STRICT,
                               (OS_ERR*             )&err);
为什么接受一帧数据后延时1s?去掉这句试一试。。。
人有的时候真是奇怪,选择了会后悔,放弃了会遗憾,完美只能是一种理想,不是一种存在。

回复

使用道具 举报

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

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-4 08:47 , Processed in 0.255537 second(s), 29 queries , Gzip On, MemCache On.

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