STM32的CAN总线调试——与以太网转CAN联调的小问题
来源:互联网 发布:excel不重复数据计数 编辑:程序博客网 时间:2024/05/24 06:40
现象:单片机与服务器双向通信,服务器发一次数据等待单片机响应,响应完成继续发送,没有响应等待1秒再次发送;单片机向服务器发送数据同理。测试进行了几万次数据交流,发现一个规律:服务器向单片机发送的数据单片机都能够接收,而且正常回应,服务器也能够全部收到,例如服务器发了10000次数据,单片机就能够收到10000次数据也能响应服务器10000次。而单片机向服务器发送的请求,服务器却不一定能够全部收到,但是只要服务器收到的请求,都能够做出响应,比如单片机发出了10000次数据,但是服务器却直接受到了9990次,也给单片机响应了9990次,丢了10次。
遇到这个问题后怎么想也想不明白,为什么单片机响应服务器的数据一个没丢,但是请求服务器的数据却会丢呢?
调试过程:将测试次数减少,只要发生丢失数据的情况就立即停止。于是单片机与服务器继续通信,在丢失第一个数据的时候停下来查看状态,发现单片机发送请求的同时,服务器也在发送请求。那么为什么单片机的请求却失败后没有再次发送?回到单片机的代码当中发现在CAN模块初始化的时候禁止自动重发的功能为使能状态,也就是单片机在发送数据的时候,只发送一次,即使发送失败了也不会去管,而是返回发送完成的状态。所以,单片机在与服务器端用的以太网转CAN模块的较量当中,丢掉了数据,服务器发送成功。
那么,还有一个问题,就是为什么单片机给服务器发的响应都会成功?这与上层代码的逻辑有关,因为服务器向单片机发送完请求后会等待单片机响应,此时的总线只有单片机在占用,所以单片机发的相应数据会每次都成功。
后来,使用了单片机的自动重发功能后再次测试,发现单片机发出的请求没有发生丢包的现象。
查阅STM32的数据手册,发现这个自动重发功能如果启用,当单片机检测到发送数据失败后会一直重发,直到成功。而如果不用这个功能,则单片机的CAN控制器只发一次数据,不去换结果如何。
- STM32的CAN总线调试——与以太网转CAN联调的小问题
- STM32的CAN总线调试
- STM32里CAN总线的问题
- 【转】 STM32的can总线实验心得
- STM32的CAN总线使用
- STM32的CAN总线使用指南
- STM32 CAN总线调试的一点心得总结
- STM32的CAN总线过滤器的配置
- 基于stm32的can总线彻底研究
- 学习stm32 can总线的一些概念
- 基于stm32的can总线彻底研究
- 基于stm32的can总线彻底研究
- STM32学习笔记:CAN总线的过滤器
- STM32的CAN总线学习总结
- STM32——CAN总线系列
- STM32——CAN总线通信
- 485总线与CAN总线的区别
- STM32调试CAN总线RxMessage.Id异常
- 最近看的iOS的书籍(进阶)
- 欢迎使用CSDN-markdown编辑器
- URL的参数中一定要避免的非法字符
- 我的2016——初入程序员
- IsPpstBack判断
- STM32的CAN总线调试——与以太网转CAN联调的小问题
- 80端口占用异常解决方法java.net.BindException: Address already in use: JVM_Bind:80(或8080)
- ZCMU-1165-dp
- 【Intellij Idea】 部署Maven项目到Tomcat的方式
- RabbitMQ四种Exchange类型之Headers(Java)
- xss攻击与防御
- //网络Okhttp
- LeetCode 83. Remove Duplicates from Sorted List
- Spark错误异常-stdout日志乱码