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

2019-07-20 14:45发布

求大神,我在定义好标识符,帧格式等以后,在数据场赋值时候,进行多帧循环赋值发送,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 ", 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。。。。 ");
//                                }
//                                if(i>=0XFFF)
//                                {
//                                        return 1;
//                                }
//                                printf("1发送成功-one ");
//                                for(p=0;p<8;p++)
//                                {
//                                        printf("TX2:TxMessage.Data[%d]=%d ",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 ", 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 ");
//                               
//                                for(p=0;p<(len%8);p++)
//                                {
//                                        printf("TX3:TxMessage.Data[%d]=%d ",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 ",i, RxMessage.Data[i]);
                        }
                        n1=n;
                }
                if((RxMessage.Data[0]!=0xaa)&&(RxMessage.Data[1]!=0x55))
                {
                        //printf("RxMessage.Data[2]=%d ",RxMessage.Data[0]);
                        n=n1;
                        for(i=0;i<RxMessage.DLC;i++,n++)
                        {
                                buf[n]=RxMessage.Data[i];  
                                printf("RX1:RxMessage.Data[%d]=%d ",i,RxMessage.Data[i]);
                        }
                        n1=n;
                        printf("n3=%d ",n);
                        printf("n1=%d ",n1);
                }
        }
        return n;       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
蓝风3101
1楼-- · 2019-07-20 17:40
 精彩回答 2  元偷偷看……
365mcu
2楼-- · 2019-07-20 19:14
CAN有邮箱FIFO缓存的最多3个也就是3*8=24个数据字节,多了的话你就判断邮箱是否可用。
蓝风3101
3楼-- · 2019-07-20 21:28
 精彩回答 2  元偷偷看……
蓝风3101
4楼-- · 2019-07-20 22:10
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给丢失了,求教怎么处理?
bachelor
5楼-- · 2019-07-21 00:56
收藏了
Lone
6楼-- · 2019-07-21 03:30
 精彩回答 2  元偷偷看……

一周热门 更多>