html做企业门户网站,揭阳企业网页制作公司,苏州网站建站公司,网站部兼容ie6场景#xff1a;
can标准帧中每一帧只能传输8字节#xff0c;而应用中传输一包的内容往往超过8字节#xff0c;因此需要把一个包拆成多个帧发送#xff0c;接收端才把收到的多帧重新组装成一个完整的包 问题描述
在一问一答的两块板间通信#xff0c;多帧连发是能够按照…场景
can标准帧中每一帧只能传输8字节而应用中传输一包的内容往往超过8字节因此需要把一个包拆成多个帧发送接收端才把收到的多帧重新组装成一个完整的包 问题描述
在一问一答的两块板间通信多帧连发是能够按照顺序发送的。但是在一个主板和多个从板之间轮询一问一答的通信中偶尔出现持续一段时间或者长时间无法通信的情况特别高帧率发送的情况下几乎无法通信。
原因分析
抓取can总线数据发现不同板之间的帧相互交叉乱序导致接收到的包因为乱序无法还原。但是不能保证多帧连续发送的话就会导致无法还原包。如图7E和E7之间为一包但其出现乱序 发送过程大致为
把包根据8字节拆分为多个帧调用发送函数HAL_CAN_AddTxMessage塞第一帧进发送邮箱id为本设备IDcan自动从邮箱里面取出该帧发送发送完毕触发邮箱发送完毕中断在中断里面再调用HAL_CAN_AddTxMessage塞下一帧进发送邮箱ID为0以最高优先级占用CAN总线循环直到最后一帧 以上过程按道理很快就可以连续发送但是就是会出现不连续的情况。因为采用的轮询方式很难保证其他can总线的设备不也在同时在竞争can总线在发送完毕进入中断塞数据进邮箱的空隙尽管ID号是0但是在竞争总线的时刻还在中断里面塞数据进邮箱并未参与can总线竞争就会被其他的设备竞争掉总线了待填充完邮箱因为ID号为0其又可以占用can进行发送就出现了本设备的帧和其他设备的帧交叉了。
解决方案
其原因就是发送中出现时间停顿让其他can设备有了可乘之机因此保证多帧之间在上一帧发送完毕立马竞争总线进入下一帧发送就可以保证该包是连续发送的。以下是我的改进
开启邮箱按照填写顺序发送而不是根据邮箱ID优先级发送一包多帧的数据持续塞满三个邮箱确保多帧发送过程中没有出现三个邮箱都出现空的情况 在裸机的时候其可以连续高帧率发送不出现乱帧但是开启FREERTOS后还会出现乱帧的情况其原因是can的发送中断被freertos管理需要把use freertos function关掉使用裸机的中断我把其优先级设为1. 但是还是有但是我的freertos任务多了以后还是出现乱帧的情况检查后发送我的第一次填写邮箱是在代码里面进行的也就是说我塞邮箱的过程中freertos会打断我塞数据的过程导致有概率不是连续塞数据进去邮箱的。如图虽然我在代码调用的发送中断函数但是其程序指针运行在psp下而不是msp下优先级就是普通的freerto任务自然不能保证以高优先级连续塞数据进发送邮箱了。 改进为如下分包好后通过HAL_NVIC_SetPendingIRQ追加一个发送中断其不会执行发送过程就可以直接触发发送中断这下子没其他东西在打扰塞满发送邮箱了吧
总结
经过测试can总线每秒8000帧数据的情况下有10%的错误率检查后发现顺序没乱有些帧没能发送来就丢弃了因为我设置的发送失败不重发。降低速率至60001%内的错误率帧没发出现的数量大幅度下降证明还是太快了。设置30000%错误率为什么3000就是0%呢看了一下can总线发送我的每一包发送需要时间是1ms一包大概3帧也就是1s上限差不多是3000多帧。