现象:单片机与服务器双向通信,服务器发一次数据等待单片机响应,响应完成继续发送,没有响应等待1秒再次发送;单片机向服务器发送数据同理。测试进行了几万次数据交流,发现一个规律:服务器向单片机发送的数据单片机都能够接收,而且正常回应,服务器也能够全部收到,例如服务器发了10000次数据,单片机就能够收到10000次数据也能响应服务器10000次。而单片机向服务器发送的请求,服务器却不一定能够全部收到,但是只要服务器收到的请求,都能够做出响应,比如单片机发出了10000次数据,但是服务器却直接受到了9990次,也给单片机响应了9990次,丢了10次。
遇到这个问题后怎么想也想不明白,为什么单片机响应服务器的数据一个没丢,但是请求服务器的数据却会丢呢?
调试过程:将测试次数减少,只要发生丢失数据的情况就立即停止。于是单片机与服务器继续通信,在丢失第一个数据的时候停下来查看状态,发现单片机发送请求的同时,服务器也在发送请求。那么为什么单片机的请求却失败后没有再次发送?回到单片机的代码当中发现在CAN模块初始化的时候禁止自动重发的功能为使能状态,也就是单片机在发送数据的时候,只发送一次,即使发送失败了也不会去管,而是返回发送完成的状态。所以,单片机在与服务器端用的以太网转CAN模块的较量当中,丢掉了数据,服务器发送成功。
那么,还有一个问题,就是为什么单片机给服务器发的响应都会成功?这与上层代码的逻辑有关,因为服务器向单片机发送完请求后会等待单片机响应,此时的总线只有单片机在占用,所以单片机发的相应数据会每次都成功。
后来,使用了单片机的自动重发功能后再次测试,发现单片机发出的请求没有发生丢包的现象。
查阅STM32的数据手册,发现这个自动重发功能如果启用,当单片机检测到发送数据失败后会一直重发,直到成功。而如果不用这个功能,则单片机的CAN控制器只发一次数据,不去换结果如何。
上一篇:STM32 CAN 波特率、采样点设置
下一篇:STM32 中 CAN进入错误回调函数后无法接收问题(HAL库)
设计资源 培训 开发板 精华推荐
- 基于PD85050S的RF电源模块,用于移动无线电应用
- 使用 Analog Devices 的 LT1109CN8 的参考设计
- 用于 MCU 系统负载感应的 NCP300LSN34T1 3.4V 电压检测器的典型应用
- LT3571 演示板、用于 APD 偏置的 DC/DC 升压转换器
- EVAL-ADXL326Z,用于 ADXL326 3 轴加速度计的评估板
- 用于工业应用的 LT3973IDD-3.3 3.3V 降压转换器的典型应用
- 基于汽车 SENT 接口的热电偶温度传感器,使用 ADuC7060/ADuC7061 精密模拟微控制器进行冷端补偿
- LTC3624EMSE-23.3 3.3V 输出电压、2A 同步降压稳压器、同步至 500kHz、强制连续模式的典型应用
- 具有迟滞功能的 NCV33074DR2G 低输入电压比较器的典型应用
- NCP785A 宽输入电压范围 10mA 超低 Iq、高 PSRR 线性稳压器的典型应用,适用于 85 VAC - 260 VAC