• 已解决 63021 个问题
  • 已帮助 5942 位优秀工程师

我用STM32,处理一个模块发出的数据,易导致丢失数据

进阶小菜鸟 2019-04-19 浏览量:582
我用STM32,处理一个模块发出的数据但是有点问题,用串口接收,数据大概是52个字节的帧头+8个字节的数据+N*68个数据这样的,串口波特率是921600,数据发送太快,感觉总是处理不过来,原来的程序是用的HAL库,判断成功了才接收下一个,但是我用的标准库,接收总是只能接收一部分了再判断。很容易导致丢失数据。导致不准确。有没有什么比较大量数据用串口处理的经验。谢谢?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你的这个速度很快。

    你可以尝试往两个方向走。

    1、使用串口接收中断。在中断中,只接收单字节的数据,不对数据进行判断。

         在主循环中才处理数据和分析。

    2、使用串口DMA接受+串口IDLE中断。

        

    两个方案都要有缓存数据区,因为处理数据的时间可能要大于单次单次接收数据的时间。


    • 发布于 2019-04-20
    • 举报
    • 评论 0
    • 3
    • 0

其他答案 数量:3
  • 你这种情况需要用环形缓存的方式就可以了,数据接收为主要任务,有空余时间就处理,但是处理速度一定要大于接收速度,不然缓存会越来越满导致溢出丢失数据,环形缓存网上有例程的
    • 发布于2019-04-20
    • 举报
    • 评论 0
    • 2
    • 0

  • 使用串口中断+DMA的方式应该不会出现数据丢包的现象,CPU响应DMA中断来处理数据,这样就接收和处理互不影响
    • 发布于2019-04-20
    • 举报
    • 评论 0
    • 1
    • 0

  • 这种通信速度比较快,而且系统可能还有别的中断的,建议不要每收到一个字节就产生一次中断,这样容易丢,可以用DMA,DMA的特点就是接收数据的过程由硬件DMA控制器完成,不需要应用程序去处理,等到收完了DMA控制器会产生一个中断,这时候应用才去取数据并处理

    像你这里的,应该是那种不定长的数据,可以用循环DMA的方式,做一个环形缓冲区处理

    • 发布于2019-04-21
    • 举报
    • 评论 0
    • 1
    • 0

我用STM32,处理一个模块发出的数据,易导致丢失数据