顶风尿十丈 2022-09-12 15:31 采纳率: 100%
浏览 90
已结题

stm32如何从串口缓存区提取部分所需内容

有一个需求:stm32是通过4g模组下载bin文件来升级自己本身,我使用的是串口中断接收数据,每次获取1k的数据,目前接收每k数据正常,但是他这个模组有一个特性是每K数据的开头会有固定的数据例如connet 1024然后中间是1k的数据内容,结尾有一个ok表示接收完成
因为是要烧录bin文件到flash,所以每次得剔除掉开头和结尾固定的那几个字符,我目前的水平解决的方式是for循环依次把需要的数据复制到另一个缓存区B,程序写法是

for (int j = 16;j < 1040;j++) //串口接收缓存区剔除开头connect\r\n 1024和结尾\r\nOK,重新保存到另一个缓存
            {

                //printf("断点:%d\r\n", j);
                filebuff[j - 16] = EC20rev[j];
                HAL_Delay(10);
            }

为啥是16开始,因为这样可以避免开头的connect\r\n 1024 连空格算上,从第16个开始是有用的数据内容,一直循环1024次才能获取到需要的数据
这个操作目前是可以解决问题,但是耗时太久,因为每获取1K的文件都要如此,我测试过好几次,下载大概25k左右的bin文件需要10分钟左右。
所以请教各位老 师,如何快速且有效的提取中间部分内容?
在此万分感谢

  • 写回答

2条回答 默认 最新

  • emXiaoMing 2022-09-12 16:44
    关注

    接收中断里面判断读到connect 1024后再继续读取1024字节放到buffer里,这样buffer里就只有有效数据了。
    或者把buffer里数据写到flash时,用2层for循环,第二层for循环每1040字节一组,写的时候从第16个字节开始写1024字节。
    这两个都可以节省转存的时间,如果非要转存的话可以用DMA,个人认为没必要的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月28日
  • 已采纳回答 9月20日
  • 创建了问题 9月12日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法