再来请教 CAN :数据 会重发 一般是怎么引起的?

2020-01-01 17:56发布


如图

2019-09-26_183315.png (5.1 KB, 下载次数: 0) 下载附件 2019-9-26 18:34 上传

蓝 {MOD} 帧在前面已经发过了,结果又重新传了一次,DATA5是一个计数器,发一次加1

这样排除了软件中重新调用的可能;

===

发送方式用的是 自动重发

以下是发送函数
                MailBox =  CAN_Transmit(CANx, &CanToCanTxMsg[CanTxMsgOut].CanTransStruc);
                if(MailBox==CAN_TxStatus_NoMailBox)
                {
                        return;//break;
                }
       
                i = 0;
                while((CAN_TransmitStatus(CANx, MailBox)==CAN_TxStatus_Failed)&&(i<0XFFF)) i++;
                if(i >= 0XFFF)
                {
                        return;
                }

=====
想到一种可能性,不知道有多大
假设开始时在邮箱1中发送不成功,下次发送转到邮箱2中发送

过了一会儿 邮箱1又发送成功,这样2个邮箱都发送了才出现偶尔发送2次的情况
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
xymxym
1楼-- · 2020-01-03 14:56
当前帧有没有发送完,最好判断CAN_TxStatus_Ok标志。以前帮别人查找一个CAN的问题,也是判断CAN_TxStatus_Failed标志位,用一段时间后CAN就无法发送了,通过串口打印CAN各寄存器值出来分析发现,当出现异常时,后续不再发送任何数据了,但邮箱一直是满的,无法自动清空,除非将芯片复位才有办法清空,后来改成判断CAN_TxStatus_Ok才解决。当然,这种方式是阻塞式运行,基本就一个邮箱在使用,但在没搞清楚STM32的CAN邮箱切换机制情况下,还是有效的。
isakura
2楼-- · 2020-01-03 19:36
结贴吧,问题可能定位出来了,

是另一端 的 CAN 出问题了,另一端 会记录ID,然后会把ID转出来....

=====

太坑人了,原来别人写的程序,害的自己搞了两天,结果查出来还不是自己问题....

====

感谢各位提供的帮助

一周热门 更多>