OpenEdv-开源电子网

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

CAN总线多帧发送问题求助???

[复制链接]

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
发表于 2016-1-20 09:06:01 | 显示全部楼层 |阅读模式
5金钱
求大神,我在定义好标识符,帧格式等以后,在数据场赋值时候,进行多帧循环赋值发送,24个字节时候都可以,超过24个字节时候,接收就有错,请大神指教怎么才能发送更多字节不丢数据?
下面是发送和接收的函数:

//u8 CAN1_Send32_Msg(u32* msg,u8 len)  //len表示总的需要发送字节数
//{       
//  u8 mbox,CAN_TxStatues;
//  u16 i=0;
//        u8 m=0; //每次发送的字节数;
//        u8 n=0; //需要发送的字节数;
//        u8 p=0;        //清除缓存;
//        u8 flag=0; //次数标志位;
//  CanTxMsg TxMessage;
//  TxMessage.StdId=0x12;                                         // 标准标识符
//  TxMessage.ExtId=0x12;                                   // 设置扩展标示符
//  TxMessage.IDE=CAN_Id_Standard; // 标准帧
//  TxMessage.RTR=CAN_RTR_Data;                 // 数据帧
//
//        for(n=0;n<len;)
//        {
//                        TxMessage.Data[m]=msg[n];
//                        m++;
//                        n++;
//                        while(m%8==0)
//                        {
//                                TxMessage.DLC=8;
//                                i=0;
//                                m=0;

//                                mbox= CAN_Transmit(CAN1, &TxMessage);
//                                printf("1mbox-one=%d\r\n", mbox);
//                                CAN_TxStatues=        CAN_TransmitStatus(CAN1,mbox);
//                                while((CAN_TxStatues!=CAN_TxStatus_Ok)&& (i<0XFFF))
//                                {
//                                        CAN_TxStatues=        CAN_TransmitStatus(CAN1,mbox);
//                                        i++;
//                                        printf("1正在发送-one。。。。\r\n");
//                                }
//                                if(i>=0XFFF)
//                                {
//                                        return 1;
//                                }
//                                printf("1发送成功-one\r\n");
//                                for(p=0;p<8;p++)
//                                {
//                                        printf("TX2:TxMessage.Data[%d]=%d\r\n",p, TxMessage.Data[p]);
//                                }
//                                for(p=0;p<8;p++)
//                                {
//                                        TxMessage.Data[p]=0;
//                                }
//                                flag++;
//                                break;
//                        //        return 0;       
//                               
//                        }
//                       
//                        while((len/8==flag)&&(m==(len%8))&&(m!=0))
//                        {
//                                TxMessage.DLC=len%8;       
//                                m=0;
//                                i=0;
//                                mbox= CAN_Transmit(CAN1, &TxMessage);
//                                //printf("2mbox-two=%d\r\n", mbox);
//                                CAN_TxStatues=        CAN_TransmitStatus(CAN1,mbox);
//                                while((CAN_TxStatues!=CAN_TxStatus_Ok)&& (i<0XFFF))
//                                {
//                                        CAN_TxStatues=        CAN_TransmitStatus(CAN1,mbox);
//                                        i++;
//                                }
//                                if(i>=0XFFF)
//                                {
//                                        return 1;
//                                }
//                                printf("3发送成功-one\r\n");
//                               
//                                for(p=0;p<(len%8);p++)
//                                {
//                                        printf("TX3:TxMessage.Data[%d]=%d\r\n",p, TxMessage.Data[p]);
//                                }
//                                for(p=0;p<8;p++)
//                                {
//                                        TxMessage.Data[p]=0;
//                                }
//                                break;       
//                        }
//                }       
//        return 0;       
//}


接收:
u8 CAN1_Receive_Msg(u32 *buf)
{                                     
        u32 i;
        u8 n=0;
        u8 p;
        CanRxMsg RxMessage;
        //p=CAN_MessagePending(CAN1,CAN_FIFO0);
        while(CAN_MessagePending(CAN1,CAN_FIFO0)!=0)
        {
                CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据       
        //        p=CAN_MessagePending(CAN1,CAN_FIFO0);
                if((RxMessage.Data[0]==0xaa)&&(RxMessage.Data[1]==0x55))
                {
                        for(i=0;i<RxMessage.DLC;i++,n++)
                        {
                                buf[n]=RxMessage.Data[i];  
                                printf("RX2:RxMessage.Data[%d]=%d\r\n",i, RxMessage.Data[i]);
                        }
                        n1=n;
                }
                if((RxMessage.Data[0]!=0xaa)&&(RxMessage.Data[1]!=0x55))
                {
                        //printf("RxMessage.Data[2]=%d\r\n",RxMessage.Data[0]);
                        n=n1;
                        for(i=0;i<RxMessage.DLC;i++,n++)
                        {
                                buf[n]=RxMessage.Data[i];  
                                printf("RX1:RxMessage.Data[%d]=%d\r\n",i,RxMessage.Data[i]);
                        }
                        n1=n;
                        printf("n3=%d\r\n",n);
                        printf("n1=%d\r\n",n1);
                }
        }
        return n;       
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-20 09:06:02 | 显示全部楼层
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-1-20 10:46:55 | 显示全部楼层
CAN有邮箱FIFO缓存的最多3个也就是3*8=24个数据字节,多了的话你就判断邮箱是否可用。
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-20 11:22:17 | 显示全部楼层
365mcu 发表于 2016-1-20 10:46
CAN有邮箱FIFO缓存的最多3个也就是3*8=24个数据字节,多了的话你就判断邮箱是否可用。

明白了,相当于我这一次循环最多缓存3个邮箱,如果想再多,就需要清空邮箱再发送了啊,那这样我想发40个字节的,就需要两个循环,每个循环发三次。这样每个循环中的三次发送和接收是连续的,两个循环之间的的数据接收是不连续的,需要重新判断接收位了啊
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-12-31
在线时间
34 小时
 楼主| 发表于 2016-1-20 14:29:01 | 显示全部楼层
365mcu 发表于 2016-1-20 10:46
CAN有邮箱FIFO缓存的最多3个也就是3*8=24个数据字节,多了的话你就判断邮箱是否可用。

我又想了一下,发送的时候在相同的标识符下,可以发送多次,例如我发送五次,把数据发送过去了,但是接收的时候CAN_MessagePending(CAN1,CAN_FIFO0)这句话其实一直有数据接收,不能于0,这时候我怎么让CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);这句函数对发送的五个数据全部处理呢,好像是五组数据全发送成功了,但是接收时候一个队列只能接收三个报文,所以我发送1 2 3......38 39 40 ,接收的时候只是收到 1 2 3......16  33 34 35 36 37 38 39 40,中间17到32给丢失了,求教怎么处理?
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-5-17
在线时间
8 小时
发表于 2016-6-3 23:18:34 | 显示全部楼层
收藏了
回复

使用道具 举报

5

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-5-29
在线时间
5 小时
发表于 2016-6-4 16:05:40 | 显示全部楼层
路过学习
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
发表于 2017-5-8 14:58:59 | 显示全部楼层
路过学习下
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2019-5-9
在线时间
18 小时
发表于 2019-7-22 19:49:16 | 显示全部楼层
路过学习
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 10:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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