linux串口环形缓冲区,STM32-串口通信之环形缓冲区

在我们使用STM32系列开发的过程中,经常会用到USART串口来传输数据,小编近期正好处理了两种串口数据:subs信号和惯导信号。遇到了一些问题,有一些心得体会在这里分享一下。

首先基本交接一个最基本的概念,波特率——在串口通信中波特率就是每秒能传输的数据位,波特率9600就是每秒能传输9600位,1Word=2byte、1byte=8bit,这里的9600位指的是9600bit。为什么先引入波特率呢,一个是串口通信中波特率是什么重要的一个参数,另一个是引入传输速度不同,带来的的问题,丢帧是常见的问题之一。这也是本文所分享的为什么会用到环形缓冲区这样一个方法。

小编最近处理的惯导数据波特率较大为307200,字节数较多,打次使用printf函数打印,占用了不少时间,如下图。在小编没有用环形缓冲区之前,会不断丢失4帧帧数据。导致系统正在处理这帧数据时,新的帧数据不断发送过来,来不及处理就被下一帧数据覆盖了。

2404a75a51f3134c1127945cb8d7030e.png

下面是小编所使用的方法,首先要定义一个二维数组来存放我们的数据帧,具体给多大空间,需要根据我们程序合理判断。简单介绍一下,内存拷贝函数memcpy,函数原型:void *memcpy(void *dest, const void *src, size_t n),memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。这一步即是将我们的多帧串口数据保存到了我们定义的这个二维缓冲数组里。

bbcec07aed351132c88176d6a30a25fa.png

645c96a4202fa5e69675311fdf0f8cc0.png

下图是读取和使用这个缓冲数组,重点是下图的最后几行,关键点就是储存和读取处理时用两个变量,本文使用的j、k来实现。

289b4b23e18a78a10aa7f4944ef6a562.png

长按下图关注此公众号,串口通信相关问题可以后台留言小编一起讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值