黄同学来学习 发表于 2019-1-14 14:49:42

stm1024 发表于 2019-1-14 13:21
你的问题可能不是丢包,应该是数据被新的数据给替换了

//ÖжϷþÎñº¯Êý                          
void USB_LP_CAN1_RX0_IRQHandler(void)
{
        CanRxMsg RxMessage;
                int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
//                        for(i=0;i<RxMessage.DLC;i++)
//                                {
//                                        if(RxMessage.Data==0x40)
//                                        {
//                                                canData=RxMessage.Data;
//                                        }
                        for(i=0;i<8;i++)//ÓÐÊý¾Ý½ÓÊÕÖжϣ¬ÕâÀï½ÓÊÕµ½Ò»Ö¡Êý¾Ý£¬¼´8×Ö½Ú
                        {
                                canData=RxMessage.Data;
                                j++;
                        }
                       
                        if(canData==0x40)//ÅжÏÊÇ·ñ±¨ÎĵÚÒ»×Ö½ÚÊÇ·ñΪ0x40
                        {       
                                canData_len=(canData<<8|canData);//½«µ±Ç°±¨Îij¤¶È°´8×Ö½Ú¼ÆËã
                                sun=canData_len/8;//¼ÆË㵱ǰ±¨ÎÄÓжàÉÙÖ¡Êý¾Ý
                        }
                        if(sun==0)//ÊÇ·ñ½ÓÊÕÍ굱ǰ±¨ÎÄÖ¡Êý
                        {
                                j=0;//½«Êý×éϱ껹ԭΪ0
                        }       
                        sun--;

//        j++;
//        printf("\r\n%d\r\n",j);
//                printf("\r\n");
}


这个是我改的中断服务函数   一直不行

黄同学来学习 发表于 2019-1-14 14:55:13

stm1024 发表于 2019-1-14 13:21
你的问题可能不是丢包,应该是数据被新的数据给替换了

//中断服务函数                          
void USB_LP_CAN1_RX0_IRQHandler(void)
{
        CanRxMsg RxMessage;
                int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
//                        for(i=0;i<RxMessage.DLC;i++)
//                                {
//                                        if(RxMessage.Data==0x40)
//                                        {
//                                                canData=RxMessage.Data;
//                                        }
                        for(i=0;i<8;i++)//有数据接收中断,这里接收到一帧数据,即8字节
                        {
                                canData=RxMessage.Data;
                                j++;
                        }
                       
                        if(canData==0x40)//判断是否报文第一字节是否为0x40
                        {       
                                canData_len=(canData<<8|canData);//将当前报文长度按8字节计算
                                sun=canData_len/8;//计算当前报文有多少帧数据
                        }
                        if(sun==0)//是否接收完当前报文帧数
                        {
                                j=0;//将数组下标还原为0
                        }       
                        sun--;

//        j++;
//        printf("\r\n%d\r\n",j);
//                printf("\r\n");
}

黄同学来学习 发表于 2019-1-14 14:57:28

stm1024 发表于 2019-1-14 13:21
你的问题可能不是丢包,应该是数据被新的数据给替换了

//中断服务函数                          
void USB_LP_CAN1_RX0_IRQHandler(void)
{
        CanRxMsg RxMessage;
                int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
//                        for(i=0;i<RxMessage.DLC;i++)
//                                {
//                                        if(RxMessage.Data==0x40)
//                                        {
//                                                canData=RxMessage.Data;
//                                        }
                        for(i=0;i<8;i++)//有数据接收中断,这里接收到一帧数据,即8字节
                        {
                                canData=RxMessage.Data;
                                j++;
                        }
                       
                        if(canData==0x40)//判断是否报文第一字节是否为0x40
                        {       
                                canData_len=(canData<<8|canData);//将当前报文长度按8字节计算
                                sun=canData_len/8;//计算当前报文有多少帧数据
                        }
                        if(sun==0)//是否接收完当前报文帧数
                        {
                                j=0;//将数组下标还原为0
                        }       
                        sun--;

//        j++;
//        printf("\r\n%d\r\n",j);
//                printf("\r\n");
}

stm1024 发表于 2019-1-14 15:35:02

黄同学来学习 发表于 2019-1-14 14:57
//中断服务函数                          
void USB_LP_CAN1_RX0_IRQHandler(void)
{


if(RxMessage.Data==0x40)
为什么有这种写法?Data是一个数组啊喂

zts329547875 发表于 2019-1-14 15:52:29

打包,拆包,重组,校验:lol

mmuuss586 发表于 2019-1-14 16:04:29

:)
分成多个包发,一个中断接收

黄同学来学习 发表于 2019-1-14 17:18:11

Johnson Cao 发表于 2019-1-14 13:57
使用环形缓冲区,中断写,main里读就行了.环形缓冲研究下,以后搞通信,用得上的地方多了去. ...

can是按帧发送的   非常感谢大家支持

黄同学来学习 发表于 2019-1-14 17:19:03

谢谢三位大神的指教   自己已经搞定了   非常感谢

黄同学来学习 发表于 2019-1-14 17:20:21

stm1024 发表于 2019-1-14 15:35
if(RxMessage.Data==0x40)
为什么有这种写法?Data是一个数组啊喂

是写漏了谢谢哈

黄同学来学习 发表于 2019-1-14 17:20:50

zts329547875 发表于 2019-1-14 15:52
打包,拆包,重组,校验

是的   就是实现起来才难
页: 1 [2] 3
查看完整版本: stm32f103CAN口怎么接收来自上机位的一包32字节的数据