在一些应用场合中,要求串口接收的数据不能丢同时又方便帧解析,我之前的做法是定义一个二维数组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

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

被折叠的 条评论
为什么被折叠?



