历史上的今天
今天是:2024年10月08日(星期二)
2019年10月08日 | STM32的CAN总线调试——与以太网转CAN联调的小问题
2019-10-08 来源:eefocus
现象:单片机与服务器双向通信,服务器发一次数据等待单片机响应,响应完成继续发送,没有响应等待1秒再次发送;单片机向服务器发送数据同理。测试进行了几万次数据交流,发现一个规律:服务器向单片机发送的数据单片机都能够接收,而且正常回应,服务器也能够全部收到,例如服务器发了10000次数据,单片机就能够收到10000次数据也能响应服务器10000次。而单片机向服务器发送的请求,服务器却不一定能够全部收到,但是只要服务器收到的请求,都能够做出响应,比如单片机发出了10000次数据,但是服务器却直接受到了9990次,也给单片机响应了9990次,丢了10次。
遇到这个问题后怎么想也想不明白,为什么单片机响应服务器的数据一个没丢,但是请求服务器的数据却会丢呢?
调试过程:将测试次数减少,只要发生丢失数据的情况就立即停止。于是单片机与服务器继续通信,在丢失第一个数据的时候停下来查看状态,发现单片机发送请求的同时,服务器也在发送请求。那么为什么单片机的请求却失败后没有再次发送?回到单片机的代码当中发现在CAN模块初始化的时候禁止自动重发的功能为使能状态,也就是单片机在发送数据的时候,只发送一次,即使发送失败了也不会去管,而是返回发送完成的状态。所以,单片机在与服务器端用的以太网转CAN模块的较量当中,丢掉了数据,服务器发送成功。
那么,还有一个问题,就是为什么单片机给服务器发的响应都会成功?这与上层代码的逻辑有关,因为服务器向单片机发送完请求后会等待单片机响应,此时的总线只有单片机在占用,所以单片机发的相应数据会每次都成功。
后来,使用了单片机的自动重发功能后再次测试,发现单片机发出的请求没有发生丢包的现象。
查阅STM32的数据手册,发现这个自动重发功能如果启用,当单片机检测到发送数据失败后会一直重发,直到成功。而如果不用这个功能,则单片机的CAN控制器只发一次数据,不去换结果如何。
史海拾趣
|
我看了一些关于CORDIC算法的资料,我现在想用CORDIC算法来实现求反正切,我想问一下求反正切时主要考虑一些什么问题?那些要考虑,那些不需要考虑?例如,校正因子K需不需要考虑,旋转方向采用什么方法判断比较有利。希望熟悉的大侠给点意见,非常 ...… 查看全部问答> |
|
最easy的一个问题,VxWorks下怎么控制评估板上的LED ? VxWorks + ARM7 4510 的评估板, 在ADS下裸机编程调试通过了的一个LED闪灯程序。 把它加入到一个在VxWorks下已经可以运行的程序里面去后。(当然相应的头文件都加上了的) 不能闪灯。 观察到运行到LED闪灯程序处时,闪灯程序直接被跳过。 这是什 ...… 查看全部问答> |
|
对很多人来说,有机游离基电池可能是个很陌生的名字。有机游离基电池由NEC所开发,和传统的锂电池比起来,有机游离基电池能做到更轻,更薄,更柔软,并且有高输出以及快速充电等特性。而现在,游离基电池的研究到达了一个新的高度:NEC研制出了厚度 ...… 查看全部问答> |
|
您好 现在要把2553写成UART to SPI(slave)的一个转换程式,但却碰到了一个问题。 SPI Master端也是用 2553完成的。 状况是Slave端的2553一直没办法读到Master发送过来的SPI data,读出的值都为0x00。 经过一些测试后,发现在slave端读取的SPI m ...… 查看全部问答> |




