串口接收中断+空闲中断实现多个数据帧接收与处理

本文介绍了一种通过使用FIFO结构改进串口接收数据处理的方法,解决了帧缓存空间浪费的问题,提高了帧解析效率。通过定义两个FIFO分别存储帧数据和帧长度,避免了固定大小数组的局限,同时增加了稳定性检查机制。

在一些应用场合中,要求串口接收的数据不能丢同时又方便帧解析,我之前的做法是定义一个二维数组data[n][m],m的大小要大于最大帧长度,n用来指定帧缓存个数,每次接收到一帧数据二维数组下标n加1,将数组的最后两个字节用来存放帧长度,同时还需要用全局变量来维护帧个数,以及维护待解析的帧下标,以及即将新增的帧下标,这种做法有个缺点就是会浪费很多空间,因为帧的长度是不确定的,使得m的大小不好确定,实际使用时会尽量多定义一些。现提供一个更好的办法,解决上述的缺点。

这个方法通过使用两个FIFO来帧数据和帧解析位置,结构体定义如下:

/* FIFO */
typedef struct
{
  uint32_t in;  /* 写入数据时位置 */
  uint32_t out; /* 读取数据时位置 */
  uint32_t size; /* 缓存大小必须是2^n */
  void* pbuf;    /* 缓存指针 */
}s_kfifo_t;


typedef struct
{
  uint8_t buff[512];
  uint16_t frame[32];  /* 最大缓存的帧个数,每个成员保存帧长度,实际使用最大帧个数和帧长度有关 */
  uint16_t frame_len;  /* 当前帧长度 */
  s_kfifo_t d_kfifo;   /* 帧数据FIFO */
  s_kfifo_t f_kfifo;   /* 帧长度FIFO */
}rec_fifo_t;

s_kfifo_t 类型用于实现环形FIFO,rec_fifo_t类型用于定义接收数据缓存大小以及帧长度缓存,具体实现函数如下:

/* 变量定义 */

rec_fifo_t Rs232_Fifo=
{
  .frame_len = 0,
  
  .d_kfifo.in = 0,
  .d_kfifo.out = 0,
  .d_kfifo.size = 512,
  .d_kfifo.pbuf = Rs232_Fifo.buff,

  .f_kfifo.in = 0,
  .f_kfifo.out = 0,
  .f_kfifo.size = 32,
  .f
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值