我想知道这是否有可能在STM32微控制器中设置通过USB接口接收数据的超时。这种方法例如在UART连接中是可能(请参考AN3109,第2节.接收DMA超时)。
我找不到任何与USB接口类似的东西。更重要的是,据说只有在确实需要时才应启用USB的DMA,因为数据传输应与32位字对齐。
发布于 2019-07-01 05:34:03
您的...._if.c文件中有一个接收回调函数(如果您使用HAL)。将保留的字符复制到缓冲区。在那里实现超时。
发布于 2019-07-01 15:03:08
在UART的情况下,您所指的要么是您所说的DMA接收超时,要么是(当不使用DMA时)空闲中断。我没有意识到USB CDC会“开箱即用”出现这样的事情--你必须自己实现这个超时,这应该不会太难。有一个计时器(软件的硬件),你每次收到数据都会重新触发。将其周期设置为您选择的超时值,并在超时后执行协议解析。
如果我必须添加任何东西-这些类型的问题(不知道接收多少字节)通常在协议级解决。假设采用二进制协议,实现这一点的一种方法是让帧的开始和结束字节永远不会出现在数据中(如果它们出现了,你会对它们进行转义),在这种情况下,你会收到“开始字节”之后的所有内容,直到你收到“结束字节”。另一种方式是具有“开始字节”和指示有多少字节要接收的字段。当然,所有这些都应该以某种方式进行校验和。
话虽如此,如果您可以选择更改协议,那么您确实应该这样做。在你的交流中依赖计时,特别是在如此低的水平上,从长远来看只会招致问题和头疼。您在协议层和接口层之间引入了紧密耦合。每当你决定使用不同的界面时,这都会适得其反,因为你将不得不重新发明同样的东西。更不用说当你决定迁移到TCP/IP的时候会有多痛苦--网络抖动,丢包等等。
https://stackoverflow.com/questions/56825885
复制相似问题